Java SparseArray,检查密钥是否存在
我正在使用Java SparseArray,检查密钥是否存在,java,android,hashmap,sparse-array,Java,Android,Hashmap,Sparse Array,我正在使用HashMap实现位图缓存,并在Eclipse中收到以下警告: 为获得更好的性能,请改用新的SparseArray(…) 我以前从未听说过这个类,但在检查它时,它似乎没有一个containsKey()方法,我调用该方法从缓存中检索位图以检查它是否存在于缓存中,如果不存在,则添加它 关于检查密钥是否已经存在的最佳方法,有什么想法吗 我想我可以更改代码以使用此重载并检查null Bitmap bitmap = cache.get(key, null); 引用 SparSearray将整
HashMap
实现位图缓存,并在Eclipse中收到以下警告:
为获得更好的性能,请改用新的SparseArray(…)
我以前从未听说过这个类,但在检查它时,它似乎没有一个containsKey()
方法,我调用该方法从缓存中检索位图以检查它是否存在于缓存中,如果不存在,则添加它
关于检查密钥是否已经存在的最佳方法,有什么想法吗
我想我可以更改代码以使用此重载并检查null
Bitmap bitmap = cache.get(key, null);
引用
SparSearray将整数映射到对象。与普通对象数组不同,索引中可能存在间隙。它旨在比使用HashMap将整数映射到对象更有效
您可以使用,如果找不到键,它也会返回null。喜欢
位图位图=cache.get(键)
您可以使用:
Bitmap bitmap = cache.get(key, null);
但请理解,这与:
使用get(key,default)
的最佳方法是提供一个通用的默认情况,当找不到该键时,to是一个有效的替代项
但是没有充分的理由不使用
if(get(key)!=null)
作为contains()
的快速替换,因此您的值在各种情况下都可以为null,我建议使用索引键(int key)
这是参考资料
然后只需检查负返回值
if(mySparseArray.indexOfKey(int) < 0) {
//Item does not exist. Do something relevant
}
if(mySparseArray.indexOfKey(int)<0){
//项目不存在。请执行相关操作
}
从SparseArray的实现来看,它可能比HashMap具有更好的性能(时间复杂度)(除了对于移动环境来说有意义的较低的空间要求),这似乎是违反直觉的,因为SparseArray的get()成员使用二进制搜索(O(logn)),而HashMap使用数组索引(O(1))
为这两个类提供get()方法实现(按原样):
多种方式:
get()
:
val sparseArray = SparseArray<String>()
val someKey = 123
if (sparseArray.containsKey(someKey)) {
//do something
}
val sparseArray=sparseArray()
val someKey=123
if(sparseArray.containsKey(someKey)){
//做点什么
}
谢谢Sam,很好地解决了过载问题,我同意你的建议,用if(get(key)!=null替换。我同意检查get()是否为null。让像contains()(API 30)这样的新方法变得危险的是,如果您的测试设备API足够高,它们将在没有警告的情况下编译和运行。随后,下载生产代码的旧API用户设备崩溃。密钥可能有空值,在这种情况下,您的代码将无法确定密钥是否存在。i、 若键不存在,它将返回null,若键有null值,它也将返回null。在这种情况下,indexOfKey应该是user(参见Alex的答案)@user1991679非常旧的答案,我猜您的建议是通过更新的API实现的。然而,你的评论的答案是,int primitive不能为null。我不明白primitive不能为null这一事实与我的评论有什么关系。顺便说一句,indexOfKey是在API 1中引入的。@uset1991679好的,我现在明白你们的意思了,但我认为问题并不是关于空值的。或者那是我拍的。@user1991679事情是sparsearray不应该是地图。这是一个数组,非常长。像普通数组一样,应该返回空值或引用。如果需要检查键的存在性,则可能需要的是贴图而不是数组。我想这就是Alex的答案不相关的原因。我无法理解从您的答案到问题的联系在哪里。这是否比只使用.get
?。get(int)
更好/更差?get(int)是O(1),因为它直接检查底层数组indexOf(int)
是O(log(n)),因为它进行二进制搜索以找到正确的index@mylovemhz错了!get(int)
中的int
不是索引,而是键。因此,它不是O(1)。get(int)
和indexOfKey(int)
都具有相同的复杂性O(log(n)),一个在找到时返回位置上的值,另一个在找到时仅返回索引,否则返回负值。如果是,则get(int)
和indexOfKey(int)
都进行二进制搜索。我的错误。
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];
}
}
public int indexOfKey(int key) { // for SparseArray
if (mGarbage) {
gc();
}
return binarySearch(mKeys, 0, mSize, key);
}
val sparseArray = SparseArray<String>()
val someKey = 123
val someValue: String? = sparseArray[someKey]
if(someValue!=null){
//do something
}
implementation 'androidx.core:core-ktx:#'
implementation 'androidx.collection:collection-ktx:#'
val sparseArray = SparseArray<String>()
val someKey = 123
if (sparseArray.containsKey(someKey)) {
//do something
}