我使用HashMap<Integer, Bitmap>
实现位图缓存,并在Eclipse中收到以下警告:
请改用新的SparseArray(…)以获得更好的性能。
我以前从未听说过这个类,但检查它时,它似乎没有containsKey()
方法,我在从缓存中检索位图时调用该方法来检查它是否存在于缓存中,如果不存在,则添加它。
关于检查钥匙是否已经存在的最佳方法,有什么想法吗?
我想我可以更改代码以使用此重载并检查null吗?
Bitmap bitmap = cache.get(key, null);
您可以使用:
Bitmap bitmap = cache.get(key, null);
但要理解,这与get(key)
:相同
Bitmap bitmap = cache.get(key);
使用get(key, default)
的最佳方法是提供一个通用默认情况,当找不到密钥时,它是一个有效的替代。
但没有充分的理由不使用if(get(key) != null)
作为contains()
的快速替代品。
因此,在各种情况下,您的值都可能为null,我建议使用indexOfKey(int key)
这是indexOfKey(int键)引用。
然后只需检查负返回值
if(mySparseArray.indexOfKey(int) < 0) {
//Item does not exist. Do something relevant
}
引用文档。
SparseArrays将整数映射到对象。与普通的对象数组不同,索引中可能存在间隙。它旨在比使用HashMap将整数映射到对象更高效。
您可以使用get(int),如果找不到键,它也会返回null。喜欢
位图位图=cache.get(键);
从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)<0或get(key)==null用于检查SparseArray中键的存在,任何事情都可以,因为两者都在下面使用二进制搜索。
public int indexOfKey(int key) { // for SparseArray
if (mGarbage) {
gc();
}
return binarySearch(mKeys, 0, mSize, key);
}
多种方式:
-
如果您想使用与密钥关联的值,可以使用
get()
:val sparseArray = SparseArray<String>() val someKey = 123 val someValue: String? = sparseArray[someKey] if(someValue!=null){ //do something }
请注意,与IDE的想法相反,它可以为null,这就是我添加?
的原因。
-
如果你只是想检查它是否存在,你可以使用
indexOfKey(key) >= 0
-
如果你不喜欢上面的内容,并且想要一个更可读的选项,你可以使用ktx集合依赖项的
containsKey
:implementation 'androidx.core:core-ktx:#' implementation 'androidx.collection:collection-ktx:#'
用法:
val sparseArray = SparseArray<String>()
val someKey = 123
if (sparseArray.containsKey(someKey)) {
//do something
}