MapClassDiagram
aaarticlea/png;base64,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" alt="" />
Map
(1)维护key-value 之间的映射,key不可以重复。
(2)提供三个视图:EntryKey,Values,EntrySet
(3)map自身不能做为key,put到自身的map中。但可以作为value。
(4)使用Entry来存放Key-Value
AbstractMap
(1)Clone:浅拷贝
(2)两个Map.Entry实现SimpleEntry,SimpleImmutableEntry(不可改变Entry)
Map实现类中都有自己Map.Entry实现。
HashMap
(1)存储结构:数组+链表(哈希表+链表处理冲突),允许key为Null,浅拷贝
aaarticlea/png;base64,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" alt="" />
(2)Default Size=16,Default Load Factor=0.75. 可以在构造map时指定。
(3)transient Entry[], transient Size. 自己拥有WriteObject和ReadObject方法。
(4)capacity永远是2的倍数。
(5)HashMap.Entry 存放四个值:
final K key;
V value;
Entry<K,V> next;
final int hash;
(6)Null Key:
如果Key 为Null 则key的hash值为0,进而index值为0。
(7)get过程:参数key
public V get(Object key) { if (key == null) //如果key为Null, 则在table[0]处进行查找。 return getForNullKey(); //如果key不为Null int hash = hash(key.hashCode()); //计算hash值和index, 在table[index]下进行查找。 for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; //比较hash值和key值,如果都相同则返回value。 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; }
private V getForNullKey() { //key 为Null, index 为0. for (Entry<K,V> e = table[0]; e != null; e = e.next) { if (e.key == null) return e.value; } return null; }
(8)put过程:
public V put(K key, V value) { if (key == null) //如果key为Null return putForNullKey(value); //key 不为Null //计算hash,index int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); //如果key已经存在则进行替换,返回之前的值。 for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } //如果key不存在,则添加。 modCount++; addEntry(hash, key, value, i); return null; } //put for Null key private V putForNullKey(V value) { //在table[0]的位置进行查找,存在更新值,不存在则添加。 for (Entry<K,V> e = table[0]; e != null; e = e.next) { if (e.key == null) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(0, null, value, 0); return null; } //添加使用“头插法”,将新插入Entry放在table[index]的位置。 void addEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; table[bucketIndex] = new Entry<K,V>(hash, key, value, e); if (size++ >= threshold) //如果size大于阀值,扩充table容量。 resize(2 * table.length); }
(9)Resize 过程
void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; //如果当前capacity已经是最大值,则将阀值改为最大值 if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return; } //创建新的table Entry[] newTable = new Entry[newCapacity]; //将原table中的值重新定位到新的table当中。 transfer(newTable); //更新现有引用,并计算阀值 table = newTable; threshold = (int)(newCapacity * loadFactor); } void transfer(Entry[] newTable) { Entry[] src = table; int newCapacity = newTable.length; for (int j = 0; j < src.length; j++) { Entry<K,V> e = src[j]; if (e != null) { src[j] = null; do { Entry<K,V> next = e.next; //重新定位index int i = indexFor(e.hash, newCapacity); //头插法插入新table e.next = newTable[i]; newTable[i] = e; e = next; } while (e != null); } } }
(10)Remove 过程
final Entry<K,V> removeEntryForKey(Object key) { //计算hash值和index int hash = (key == null) ? 0 : hash(key.hashCode()); int i = indexFor(hash, table.length); //找到要遍历查找的链表头元素 Entry<K,V> prev = table[i]; Entry<K,V> e = prev; while (e != null) { Entry<K,V> next = e.next; Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) { modCount++; size--; if (prev == e) //如果删除的是头元素 table[i] = next; else //从链表中删除 prev.next = next; e.recordRemoval(this); return e; } //向后推移 prev = e; e = next; } return e; }
LinkedHashMap
LinkedHashMap在HashMap的基础上进行封装,将entry按照插入顺序链接起来,形成双向链表。
(1) LinkedHashMap.Entry 继承了HashMap.Entry 添加了before和after指针(指向LinkedHashMap.entry)。
private static class Entry<K,V> extends HashMap.Entry<K,V> { // These fields comprise the doubly linked list used for iteration. Entry<K,V> before, after; //给HashMap.Entry赋值。 Entry(int hash, K key, V value, HashMap.Entry<K,V> next) { super(hash, key, value, next); } }
(2)accessOrder:来确定按照何种顺序进行访问。
a) access-order: from least-recently accessed to most-recently. 适合使用LRU算法。(按照最近访问顺序,从最近最少使用到最近最多使用)
void recordAccess(HashMap<K,V> m) { LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m; if (lm.accessOrder) { lm.modCount++; //从链表中移除 remove(); //添加到链表尾部。 addBefore(lm.header); }}
b) insertion-order:插入顺序。
(3)重写了transfer方法,是的resize的性能提高。
void transfer(HashMap.Entry[] newTable) { int newCapacity = newTable.length; //使用链表进行迭代。 for (Entry<K,V> e = header.after; e != header; e = e.after) { int index = indexFor(e.hash, newCapacity); e.next = newTable[index]; newTable[index] = e; } }
同理其它在HashMap中需要迭代的地方都使用链表进行迭代。如containsValue,KeyIterator, ValueIterator, EntryIterator等。
(4)添加Entry的时候会调用addBefore(header)方法,建立链表关系。
private void addBefore(Entry<K,V> existingEntry) { //实际existing就是指header after = existingEntry; before = existingEntry.before; before.after = this; after.before = this; }
(5)删除时同样会删除链表关系。
private void remove() { before.after = after; after.before = before; }