JDK7、8 HashMap底层实现区别

HashMap的底层实现机制

HashMap一直是Java开发人员面试常考题,涉及到数据结构,比较考察基本功,本文对于jdk8jdk7的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

6.当数组的某一个索引上的元素以链表形式存在的数据个数 > 8 且数组的长度 > 64 时,此时此索引位置上的所有数据改为用红黑树存储

原文地址:https://www.cnblogs.com/211806210dingziming/p/14434778.html