java8 HashMap的变化
在java容器中map是我们经常会用到的一种容器。而map中HashMap是我们最长用的map之一,而且在java面试中考察容器时HashMap的实现也基本是必考之一。并且我们常常会听到考察HashMap时会问到是否是线程安全?为什么HashMap在多线程并发的时候可能造成CPU利用率变成100%?在解析HashMap的这些文章的中,都是基于Java 8之前的的实现来讲解的。那么Java 8与Java 8之前的HashMap有什么变化呢,这一篇文件会讲解一下Java 8 HashMap的关键变化。
树形桶
在对比java 8与java 7的HashMap源码实现部分。可以发现Java8的源码中静态变量多了几个:
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
static final int MIN_TREEIFY_CAPACITY = 64;
从这些变量的命名中可以看出都与tree(树)有关。那么这些变量是做什么用的,为什么与树有关呢。这就是在java8中的一个变化。如果有很多Entry都属于一个桶,原来的java7的实现是使用一个双向列表,属于一个桶的Entry都是连接在一起,那么在桶中查找对应的Entry时查找时间是线性的。