SparseArray中的indexOfValue(E value)使用的时候要特别注意,源码里面是
public int indexOfValue(E value) {
if (mGarbage) { gc(); }//这一句不用管
for (int i = 0; i < mSize; i++) {
//这个地方比较就是对内地址做了比较,不像是equals方法比较常量对象
//进行了比较,如果不注意随意使用,你就会发现返回值一直是-1,我是在使用split的时候遇到这
//个问题的。只有自己进行遍历,然后使用equals方法就可以找到值。
if (mValues[i] == value) {
return i;
}
}
return -1;
}
错误代码:
SparseArray<String> sparseArray = new SparseArray<>();
String a = "a,b,c";
String[] strs = a.split(",");
sparseArray.put(0,"aa");
sparseArray.put(1,"a");
Log.d("abcd", "onCreate: "+sparseArray.indexOfValue(a));
代替indexOfValue的方法就是:
SparseArray sy = new SparseArray<>();
for(int i = 0;i<sy.size();i++){
if(“aa”.equals(sy.valueAt(i))){
Log.d(“abcd”,i);//i就是index
}
}
基础用法很简单:
SparseArray<String> array = new SparseArray<>();
array.put(1,"a");
array.put(2,"b");
array.put(3,"c");
这个是真的坑,刚开始没注意到,花了我一段时间进行测试,才找到这个坑。
SparseArray sa = new SparseArray()<>;
可以直接获取sa.get(1) == null;而ArrayList这样做则会报数组越界。因为SparseArray的key和value是两个数组,已经经过初始化了,然后本身可以自动扩容,每次扩容是上次的2倍。
后续继续补充。