Index: working_classlib/modules/luni/src/main/java/java/util/WeakHashMap.java =================================================================== --- working_classlib/modules/luni/src/main/java/java/util/WeakHashMap.java (revision 649000) +++ working_classlib/modules/luni/src/main/java/java/util/WeakHashMap.java (working copy) @@ -187,6 +187,15 @@ this(DEFAULT_SIZE); } + private int roundTo2K(int s) { + s |= (s >> 1); + s |= (s >> 2); + s |= (s >> 4); + s |= (s >> 8); + s |= (s >> 16); + return s + 1; + } + /** * Constructs a new instance of WeakHashMap with the specified capacity. * @@ -199,6 +208,7 @@ public WeakHashMap(int capacity) { if (capacity >= 0) { elementCount = 0; + capacity = roundTo2K(capacity); elementData = newEntryArray(capacity == 0 ? 1 : capacity); loadFactor = 7500; // Default load factor of 0.75 computeMaxSize(); @@ -224,6 +234,7 @@ public WeakHashMap(int capacity, float loadFactor) { if (capacity >= 0 && loadFactor > 0) { elementCount = 0; + capacity = roundTo2K(capacity); elementData = newEntryArray(capacity == 0 ? 1 : capacity); this.loadFactor = (int) (loadFactor * 10000); computeMaxSize(); @@ -459,7 +470,7 @@ public V get(Object key) { poll(); if (key != null) { - int index = (key.hashCode() & 0x7FFFFFFF) % elementData.length; + int index = key.hashCode() & (elementData.length - 1); Entry entry = elementData[index]; while (entry != null) { if (key.equals(entry.get())) { @@ -482,7 +493,7 @@ Entry getEntry(Object key) { poll(); if (key != null) { - int index = (key.hashCode() & 0x7FFFFFFF) % elementData.length; + int index = key.hashCode() & (elementData.length - 1); Entry entry = elementData[index]; while (entry != null) { if (key.equals(entry.get())) { @@ -563,7 +574,7 @@ void removeEntry(Entry toRemove) { Entry entry, last = null; - int index = (toRemove.hash & 0x7FFFFFFF) % elementData.length; + int index = toRemove.hash & (elementData.length - 1); entry = elementData[index]; // Ignore queued entries which cannot be found, the user could // have removed them before they were queued, i.e. using clear() @@ -599,7 +610,7 @@ int index = 0; Entry entry; if (key != null) { - index = (key.hashCode() & 0x7FFFFFFF) % elementData.length; + index = key.hashCode() & (elementData.length - 1); entry = elementData[index]; while (entry != null && !key.equals(entry.get())) { entry = entry.next; @@ -614,8 +625,7 @@ modCount++; if (++elementCount > threshold) { rehash(); - index = key == null ? 0 : (key.hashCode() & 0x7FFFFFFF) - % elementData.length; + index = key == null ? 0 : key.hashCode() & (elementData.length - 1); } entry = new Entry(key, value, referenceQueue); entry.next = elementData[index]; @@ -636,8 +646,7 @@ for (int i = 0; i < elementData.length; i++) { Entry entry = elementData[i]; while (entry != null) { - int index = entry.isNull ? 0 : (entry.hash & 0x7FFFFFFF) - % length; + int index = entry.isNull ? 0 : (entry.hash & (length - 1)); Entry next = entry.next; entry.next = newData[index]; newData[index] = entry; @@ -677,7 +686,7 @@ int index = 0; Entry entry, last = null; if (key != null) { - index = (key.hashCode() & 0x7FFFFFFF) % elementData.length; + index = key.hashCode() & (elementData.length - 1); entry = elementData[index]; while (entry != null && !key.equals(entry.get())) { last = entry;