2012-09-15 71 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

我无法理解从答案到问题的连接。 –