Change contentEquals implementation to operate in O(n) time.
Calling other.get(key) does binary search in the "other" instance to look up the key, but this is not necessary, since if the two instances are equal, they will contain same keys with same values in exact same order. The cl also does some other minor changes: * avoid unnecessary method calls / bounds check in contentEquals. * avoid unnecessary method calls / bounds check / autoboxing in contentHashCode. It's possible that some of these would be done by AOT / JIT optimizations, but they generally tend to have some cost in Java. Test: atest SparseArrayTest Bug: 260964842 Change-Id: I060ea39e85056a86e986a0fe61d153c18c234f4b
This commit is contained in:
committed by
Ján Sebechlebský
parent
e87964faa5
commit
740710388b
@@ -525,9 +525,10 @@ public class SparseArray<E> implements Cloneable {
|
||||
return false;
|
||||
}
|
||||
|
||||
// size() calls above took care about gc() compaction.
|
||||
for (int index = 0; index < size; index++) {
|
||||
int key = keyAt(index);
|
||||
if (!Objects.equals(valueAt(index), other.get(key))) {
|
||||
if (mKeys[index] != other.mKeys[index]
|
||||
|| !Objects.equals(mValues[index], other.mValues[index])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -545,10 +546,11 @@ public class SparseArray<E> implements Cloneable {
|
||||
public int contentHashCode() {
|
||||
int hash = 0;
|
||||
int size = size();
|
||||
// size() call above took care about gc() compaction.
|
||||
for (int index = 0; index < size; index++) {
|
||||
int key = keyAt(index);
|
||||
E value = valueAt(index);
|
||||
hash = 31 * hash + Objects.hashCode(key);
|
||||
int key = mKeys[index];
|
||||
E value = (E) mValues[index];
|
||||
hash = 31 * hash + key;
|
||||
hash = 31 * hash + Objects.hashCode(value);
|
||||
}
|
||||
return hash;
|
||||
|
||||
Reference in New Issue
Block a user