我写了一些非常简单的代码,发现了一个非常意外的行为。所有的List
和Map
实现都使用节点的equals
方法进行比较。因此,如果你有一个字符串列表,并且尝试获取列表中一个字符串的索引,你不需要使用相同的对象。例如:
List<String> list = new ArrayList<>();
list.add("test");
int index = list.indexOf("test");
System.out.println(index);//returns 0
我注意到Android的所有SparseArray类都使用==
而不是equals
来比较节点。例如方法(LongSparseArray.java):
public int indexOfValue(E value) {
if (mGarbage) {
gc();
}
for (int i = 0; i < mSize; i++) {
if (mValues[i] == value) {
return i;
}
}
return -1;
}
如果您有类似以下这样的简单代码:
LongSparseArray<String> localContacts = new LongSparseArray<>();
localContacts.put(2, "test");
int index = localContacts.indexOfValue("test");
System.out.println(index);
这里的索引将返回-1(如果您不知道如何比较值,则这是非常意外的)。
所以我在想……为什么Android不使用“equals”呢?从Java的角度来看,这更方便和首选。现在我必须循环遍历所有
SparseArray
的值并自己进行比较,这会导致更多(不必要的)代码(或使用Map
会在Android中降低性能)。
indexOfValueByValue
来进行等值比较(编辑:算了,我发现这个方法由于某些原因被隐藏了)。 - PPartisan