Index: E:/projects/clear/eclipse/workspace/luni/src/main/java/java/util/LinkedHashMap.java =================================================================== --- E:/projects/clear/eclipse/workspace/luni/src/main/java/java/util/LinkedHashMap.java (revision 386513) +++ E:/projects/clear/eclipse/workspace/luni/src/main/java/java/util/LinkedHashMap.java (working copy) @@ -185,7 +185,7 @@ LinkedHashMapEntry chainForward, chainBackward; LinkedHashMapEntry(Object theKey, Object theValue) { - super(theKey, theValue); + super(theKey.hashCode(), theKey, theValue); chainForward = null; chainBackward = null; } Index: E:/projects/clear/eclipse/workspace/luni/src/main/java/java/util/HashMap.java =================================================================== --- E:/projects/clear/eclipse/workspace/luni/src/main/java/java/util/HashMap.java (revision 386513) +++ E:/projects/clear/eclipse/workspace/luni/src/main/java/java/util/HashMap.java (working copy) @@ -41,10 +41,13 @@ private static final int DEFAULT_SIZE = 16; static class Entry extends MapEntry { + final int hash; + Entry next; - Entry(Object theKey, Object theValue) { + Entry(int hashCode, Object theKey, Object theValue) { super(theKey, theValue); + this.hash = hashCode; } public Object clone() { @@ -57,6 +60,10 @@ public String toString() { return key + "=" + value; } + + public int hashCode() { + return hash; + } } static class HashMapIterator implements Iterator { @@ -315,8 +322,8 @@ * second key to compare * @return true iff the keys are considered equal */ - boolean keysEqual(Object k1, Object k2) { - return k1.equals(k2); + boolean keysEqual(Object k1, Entry entry) { + return entry.hashCode() == k1.hashCode() && k1.equals(entry.key); } /** @@ -391,8 +398,9 @@ Entry m; m = elementData[index]; if (key != null) { - while (m != null && !keysEqual(key, m.key)) + while(m != null && !keysEqual(key,m)){ m = m.next; + } } else { while (m != null && m.key != null) m = m.next; @@ -474,15 +482,16 @@ index = key == null ? 0 : (key.hashCode() & 0x7FFFFFFF) % elementData.length; } - entry = createEntry(key, index, null); + entry = createEntry(key, key == null ? 0 : key.hashCode(), index, + null); } Object result = entry.value; entry.value = value; return result; } - Entry createEntry(Object key, int index, Object value) { - Entry entry = new Entry(key, value); + Entry createEntry(Object key, int hashCode, int index, Object value) { + Entry entry = new Entry(hashCode, key, value); entry.next = elementData[index]; elementData[index] = entry; return entry; @@ -542,7 +551,7 @@ if (key != null) { index = (key.hashCode() & 0x7FFFFFFF) % elementData.length; entry = elementData[index]; - while (entry != null && !keysEqual(key, entry.key)) { + while (entry != null && !keysEqual(key, entry)) { last = entry; entry = entry.next; } @@ -629,7 +638,7 @@ for (int i = elementCount; --i >= 0;) { Object key = stream.readObject(); int index = (key.hashCode() & 0x7FFFFFFF) % length; - createEntry(key, index, stream.readObject()); + createEntry(key, key.hashCode(), index, stream.readObject()); } } }