@@ -467,38 +467,55 @@ private void writeMockJavaClasses(Path sourceDir) throws Exception {
467467 // java.util.HashMap
468468 Files .write (util .resolve ("HashMap.java" ), ("package java.util;\n " +
469469 "public class HashMap<K,V> implements Map<K,V> {\n " +
470- " private Object[] keys = new Object[16];\n " +
471- " private Object[] values = new Object[16];\n " +
470+ " public static class Entry<K,V> {\n " +
471+ " public K key;\n " +
472+ " public V value;\n " +
473+ " public int hash;\n " +
474+ " public int origKeyHash;\n " +
475+ " public Entry<K,V> next;\n " +
476+ " public Entry(K key, V value, int hash, Entry<K,V> next) {\n " +
477+ " this.key = key;\n " +
478+ " this.value = value;\n " +
479+ " this.hash = hash;\n " +
480+ " this.origKeyHash = hash;\n " +
481+ " this.next = next;\n " +
482+ " }\n " +
483+ " }\n " +
484+ " private Entry[] elementData = new Entry[16];\n " +
472485 " private int size = 0;\n " +
473486 " public V get(Object key) {\n " +
474- " for(int i=0; i<size; i++) if(keys[i] == key) return (V)values[i];\n " +
487+ " int h = key == null ? 0 : key.hashCode();\n " +
488+ " int idx = (h & 0x7fffffff) % elementData.length;\n " +
489+ " for (Entry e = elementData[idx]; e != null; e = e.next) {\n " +
490+ " if (e.key == key) return (V)e.value;\n " +
491+ " }\n " +
475492 " return null;\n " +
476493 " }\n " +
477494 " public V put(K key, V value) {\n " +
478- " for( int i=0; i<size; i++) { \n " +
479- " if(keys[i] == key) { \n " +
480- " V old = (V)values[i ];\n " +
481- " values[i] = value; \n " +
482- " return old;\n " +
483- " } \n " +
495+ " int h = key == null ? 0 : key.hashCode(); \n " +
496+ " int idx = (h & 0x7fffffff) % elementData.length; \n " +
497+ " Entry e = elementData[idx ];\n " +
498+ " while (e != null) { \n " +
499+ " if (e.key == key) { V old = (V)e.value; e.value = value; return old; } \n " +
500+ " e = e.next; \n " +
484501 " }\n " +
485- " if (size >= keys.length) return null;\n " + // overflow ignored for mock
486- " keys[size] = key;\n " +
487- " values[size] = value;\n " +
502+ " elementData[idx] = new Entry(key, value, h, elementData[idx]);\n " +
488503 " size++;\n " +
489504 " return null;\n " +
490505 " }\n " +
491506 " public V remove(Object key) {\n " +
492- " for(int i=0; i<size; i++) {\n " +
493- " if(keys[i] == key) {\n " +
494- " V old = (V)values[i];\n " +
507+ " int h = key == null ? 0 : key.hashCode();\n " +
508+ " int idx = (h & 0x7fffffff) % elementData.length;\n " +
509+ " Entry prev = null;\n " +
510+ " Entry e = elementData[idx];\n " +
511+ " while (e != null) {\n " +
512+ " if (e.key == key) {\n " +
513+ " if (prev == null) elementData[idx] = e.next; else prev.next = e.next;\n " +
495514 " size--;\n " +
496- " keys[i] = keys[size];\n " +
497- " values[i] = values[size];\n " +
498- " keys[size] = null;\n " +
499- " values[size] = null;\n " +
500- " return old;\n " +
515+ " return (V)e.value;\n " +
501516 " }\n " +
517+ " prev = e;\n " +
518+ " e = e.next;\n " +
502519 " }\n " +
503520 " return null;\n " +
504521 " }\n " +
0 commit comments