1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| public class MyHashMap<K, V> { private static final int DEFAULT_CAPACITY = 16; private static final float DEFAULT_LOAD_FACTOR = 0.75f; private static final int TREEIFY_THRESHOLD = 8; private Node<K, V>[] table; private int size;
public MyHashMap() { table = new Node[DEFAULT_CAPACITY]; }
static class Node<K, V> { final int hash; final K key; V value; Node<K, V> next;
Node(int hash, K key, V value, Node<K, V> next) { this.hash = hash; this.key = key; this.value = value; this.next = next; } }
public V put(K key, V value) { return putVal(hash(key), key, value); }
private V putVal(int hash, K key, V value) { Node<K, V>[] tab; Node<K, V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0) { n = (tab = resize()).length; }
if ((p = tab[i = (n - 1) & hash]) == null) { tab[i] = newNode(hash, key, value, null); } else { Node<K, V> e; K k;
if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) { e = p; } else if (p instanceof TreeNode) { e = ((TreeNode<K, V>) p).putTreeVal(this, tab, hash, key, value); } else { for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOLD - 1) { treeifyBin(tab, hash); } break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) { break; } p = e; } }
if (e != null) { V oldValue = e.value; e.value = value; return oldValue; } }
if (++size > DEFAULT_CAPACITY * DEFAULT_LOAD_FACTOR) { resize(); } return null; }
private int hash(K key) { if (key == null) { return 0; } int h = key.hashCode(); return h ^ (h >>> 16); }
private Node<K, V>[] resize() { return table; }
private void treeifyBin(Node<K, V>[] tab, int hash) { }
private Node<K, V> newNode(int hash, K key, V value, Node<K, V> next) { return new Node<>(hash, key, value, next); } }
|