HashMap的底层实现机制
HashMap一直是Java开发人员面试常考题,涉及到数据结构,比较考察基本功,本文对于jdk8
与jdk7
的HashMap源码区别做出简单
整理
HashMap底层的几个属性说明
jdk1.7、1.8共有的属性
DEFAULT_INNITIAL_CAPACITY:HashMap的默认容量:16
DEFAULT_LOAD_FACTOR: HashMap的默认加载因子:0.75
threshold:扩容的临界值:= 默认容量DEFAULT_INNITIAL_CAPACITY * 默认加载因子DEFAULT_LOAD_FACTOR = 12
jdk1.8特有的属性,涉及到转红黑树
TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转为红黑树:8
MIN_TREEIFY_CAPACITY :桶中的Node被树化时最小的hash表的容量:64
JDK1.8及1.7中HashMap的实现区别(以JDK1.8源码为例)
1.相较于jdk1.7, JDK1.8中HashMap的初始化并没有直接创建了长度为16的数组,而是只是赋予了默认的加载因子
2.jdk1.8 底层的数组是Node[],而jdk1.7底层的数组是Entry[]
final int hash;
final K key;
V value;
Node<K,V> next;
3.jdk1.8在首次调用put()方法时,底层才创建长度为16的数组,而jdk1.7在调用构造器时就创建了长度为16的数组
4.jdk1.8的底层数据结构:数组+链表+红黑树,jdk1.7底层数据结构:数组+链表
5.当形成链表时,jdk7 新元素放在数组,指向原链表,jkd8 新元素放在链表最后
jdk8
jdk7