41

我正在使用 a 实现位图缓存,HashMap<Integer, Bitmap>并在 Eclipse 中收到以下警告:

改用 new SparseArray(...) 以获得更好的性能。

我以前从未听说过那个类,但是检查它似乎没有containsKey()我在从缓存中检索位图以检查它是否存在于缓存中的方法,如果不存在,然后添加它。

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

我想我可以更改代码以使用此重载并检查是否为空?

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

5 回答 5

48

你可以使用:

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

但请理解这与以下内容相同get(key)

Bitmap bitmap = cache.get(key); 

最好的使用方法get(key, default)是提供一个通用的默认情况,当找不到密钥时,某事 to 是一个有效的替代品。

但是没有充分的理由不将if(get(key) != null)其用作contains().

于 2012-09-15T22:33:42.843 回答
32

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

然后只需检查负返回值

if(mySparseArray.indexOfKey(int) < 0) {
   //Item does not exist. Do something relevant 
}
于 2013-11-22T13:38:09.920 回答
1

从文档中引用。

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

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

位图 bitmap = cache.get(key);

于 2012-09-15T22:31:43.057 回答
1

由于 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) < 0 或 get(key) == null 来检查 SparseArray 中的键是否存在,任何事情都可以,因为两者都在下面使用二进制搜索。

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

    return binarySearch(mKeys, 0, mSize, key);
}
于 2016-03-21T07:59:10.380 回答
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. 如果您不喜欢上述内容,并且想要一个更具可读性的选项,您可以使用containsKeyktx-collection 依赖项:

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

用法:

    val sparseArray = SparseArray<String>()
    val someKey = 123
    if (sparseArray.containsKey(someKey)) {
        //do something
    }
于 2019-05-05T10:58:40.027 回答