SparseArray,检查密钥是否存在

时间:2012-09-15 22:22:36

标签: java android hashmap sparse-array

我使用HashMap<Integer, Bitmap>实现了一个Bitmap缓存,并在Eclipse中收到了以下警告:

  

使用新的SparseArray(...)代替更好的性能。

我之前从未听过那个课程,但是检查它似乎没有containsKey()方法,我正在调用从缓存中检索Bitmap来检查它是否存在存在于缓存中,如果不存在,则添加它。

有关检查密钥是否已存在的最佳方法的任何想法?

我想我可以更改代码以使用此重载并检查null?

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

5 个答案:

答案 0 :(得分:44)

您可以使用:

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

但要明白这与get(key)相同:

Bitmap bitmap = cache.get(key); 

使用get(key, default)的最佳方式是提供通用的默认情况,当找不到密钥时,有效替代

但没有充分的理由不使用if(get(key) != null)作为contains()的快速替代品。

答案 1 :(得分:29)

因此,在各种情况下,您的值可能为空,我建议使用indexOfKey(int key) 这是indexOfKey(int key) 参考。

然后只需检查负回报值

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

答案 2 :(得分:1)

引自documentation

  

SparseArrays将整数映射到对象。与普通的对象数组不同,索引中可能存在间隙。它旨在比使用HashMap将整数映射到对象更有效。

您可以使用get(int),如果找不到密钥,也会返回null。等;

  

Bitmap bitmap = cache.get(key);

答案 3 :(得分:1)

通过SparseArray的实现看起来反直觉,它可能比HashMap具有更好的性能(时间复杂度)(除了对移动环境有意义的较低空间要求),因为SparseArray的get()成员使用二进制搜索(O(log N)),而HashMap使用数组索引(O(1))。

为两个类提供get()方法实现(原样):

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(key)&lt; 0或get(key)== null用于检查SparseArray中是否存在键,一切正常,因为两者都在下面使用二进制搜索。

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

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

答案 4 :(得分:0)

多种方式:

  1. 如果仍然要使用与键关联的值,则可以使用get()

    val sparseArray = SparseArray<String>()
    val someKey = 123
    val someValue: String? = sparseArray[someKey]
    if(someValue!=null){
        //do something
    }
    

请注意,与IDE的想法相反,它可以为null,这就是我添加?的原因。

  1. 如果只想检查它是否存在,可以使用indexOfKey(key) >= 0

  2. 如果您不喜欢以上内容,并且希望使用更具可读性的选项,则可以使用ktx-collection依赖项中的containsKey

    implementation 'androidx.core:core-ktx:#'
    implementation 'androidx.collection:collection-ktx:#'
    

用法:

    val sparseArray = SparseArray<String>()
    val someKey = 123
    if (sparseArray.containsKey(someKey)) {
        //do something
    }
相关问题