由于 SparseArray 的 get() 成员使用二进制-搜索 (O(log N)) 而 HashMap 使用数组索引 (O(1))。
为两个类提供 get() 方法实现(按原样):
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];
}
}
至于是否使用 indexOfKey(key) < 0 或 get(key) == null 来检查 SparseArray 中的键是否存在,任何事情都可以,因为两者都在下面使用二进制搜索。
public int indexOfKey(int key) { // for SparseArray
if (mGarbage) {
gc();
}
return binarySearch(mKeys, 0, mSize, key);
}