Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SparseArray,检查密钥是否存在_Java_Android_Hashmap_Sparse Array - Fatal编程技术网

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
        }