2012-09-15 136 views
30

我使用的是HashMap<Integer, Bitmap>實施位圖緩存並獲得在Eclipse以下警告:SparseArray,檢查是否存在關鍵

使用新SparseArray(...),而不是有更好的表現。

我從來沒有聽說過課前的,但檢查它,它似乎並不具有containsKey()方法,我呼籲從緩存位圖的檢索,以檢查它是否存在於緩存,如果沒有,則添加它。

關於檢查密鑰是否已存在的最佳方法的任何想法?

我想我可以改變代碼來使用這個重載並檢查null?

Bitmap bitmap = cache.get(key, null); 

回答

39

你可以使用:

Bitmap bitmap = cache.get(key, null); 

但要知道,這是一樣的get(key)

Bitmap bitmap = cache.get(key); 

使用get(key, default)最好的辦法是提供一個通用的默認情況下,東西是沒有找到密鑰時的有效替代

但沒有很好的理由不使用if(get(key) != null)作爲的快速替代品。

+0

謝謝山姆,在重載的好位置,我已經與你的建議,只是取代if(get(key)!= null)。 – magritte

1

documentation引用。

SparseArrays將整數映射到對象。與普通的對象數組不同,索引中可能存在空白。它的目的是比使用HashMap將整數映射到對象更高效。

您可以使用get(int),如果找不到密鑰,它也會返回null。喜歡;

Bitmap bitmap = cache.get(key);

+0

鍵可能有空值,在這種情況下,您的代碼將無法確定鍵是否存在。即如果key不存在,它將返回null,如果key有空值,它也會返回null。在這種情況下,indexOfKey應該是用戶(請參閱Alex的回答) – user1991679

+0

@ user1991679相當古老的回答,您建議的是我通過更新的apis。但是對你的評論的回答是,int primitive不能爲null。 – auselen

+0

我不明白原始不能是null與我的評論相關的事實。 BTW,indexOfKey在API 1中引入。 – user1991679

26

因此,您的價值可以在各種情況下爲空,我會建議使用indexOfKey(int key) 這裏是indexOfKey(int key)參考。

然後只是簡單地檢查返回值爲負

if(mySparseArray.indexOfKey(int) < 0) { 
    //Item does not exist. Do something relevant 
} 
+0

這比使用'.get'好嗎? – Smar

1

由SparseArray實施走出去似乎違反直覺的,它可能比HashMap的更好的性能(時間複雜度)(小於空間需求等這對於移動環境是有意義的),因爲SparseArray的get()成員使用二進制搜索(O(log N)),而HashMap使用數組索引(O(1))。

提供了get()方法實現了兩個類(AS-IS):

public V get(Object key) { // for HashMap 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
      e != null; 
      e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

public E get(int key, E valueIfKeyNotFound) { //for SparseArray 
    int i = binarySearch(mKeys, 0, mSize, key); 

    if (i < 0 || mValues[i] == DELETED) { 
     return valueIfKeyNotFound; 
    } else { 
     return (E) mValues[i]; 
    } 
} 

是否使用indexOfKey(鍵)< 0或獲得(鍵)== NULL檢查存在在SparseArray中的關鍵字,任何事情都可以,因爲它們都在下面使用二進制搜索。

public int indexOfKey(int key) { // for SparseArray 
    if (mGarbage) { 
     gc(); 
    } 

    return binarySearch(mKeys, 0, mSize, key); 
} 
+1

我無法理解從答案到問題的連接。 –