Android SparseArray中indexOfValue返回-1

继续Android。

SparseArray<T>是蛮好用的基本类型,一般用来替换掉HashMap<Integer, T>

有时候偷懒,也会用它来替换Object[],也就是基本数组。

因为这货有indexOfValue(这样就不用去遍历找索引啦),遍历也比HashMap方便的多。可以满足对基本数组的需要(但性能不高,使用需谨慎,文档有详细解释为什么)。

但是,这玩意儿有个坑,也就在indexOfValue里面。

当用它来存储String时,可能会出现明明Value已经put进去了,但是indexOfValue就是返回-1的情况。

一开始还以为可能是线程安全相关的问题,还打算加锁来着。结果。。。

原因在于

Note also that unlike most collections' indexOf methods, this method compares values using == rather than equals.

源码如下:

public int indexOfValue(E value) {
  if (mGarbage) {
  gc();
  }

  for (int i = 0; i < mSize; i++)
  if (mValues[i] == value)
  return i;

  return -1;
}

T_T

Java中,字符串比较用==equals区别就不用解释了吧。。。


你说Android你加个方便好用的数据结构你用个equals能咋样。。。又中枪了。。。