JDK8前后哈希表的变化
JDK8之前,HashMap就和基于链表实现的哈希表结构完全一样,(基于链表实现哈希表详见另一博客);但是从JDK8之后,HashMap引入了红黑树,当一个链表的长度超过一个值时,就会“树化”,将链表转为红黑树(就会进一步的降低查找的时间复杂度。
时间复杂度变化O(n)->O(logn)).
HashMap的结构图
树化与解树化
树化:
当一个链表额长度超过树化阈值8,再判断当前整个哈希表的元素个数是否超过树化的最小容量64,若超过,将当前链表转为红黑树,若没超过最小容量,只是将哈希表扩容而不是树化。
解树化:
当一个红黑树不断删除元素后,发现红黑树的元素个数小于等于解树化阈值6,会再次把红黑树转为链表。
无论是树化与解树化都是为了效率。
put方法源码
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n =