通过两篇文章:深入源码分析HashMap到底是怎样将元素put进去的 和 HashMap扩容后,元素是如何重新分布的,我们逐一分析了HashMap的初始化和扩容机制,在末尾还留下了一个悬念,就是HashMap的树化,即什么时候转化成红黑树,以及怎么转成红黑树的没有深入探究,今天我们就来通过走读代码,一步一步走进HashMap的红黑树。
目的
探究Node
转化成TreeNode
的时机以及TreeNode
的操作机制
说明
本次探究使用的jdk版本:1.8
HashMap结构示意图
思路
通过以往的两次分析,我们得知了元素在map中的位置主要取决于元素本身的hash值,只要多个元素同时落在同一个位置上,当它满足一定条件时,就会触发链表转化成红黑树的操作
那问题就变成了如何使众多的key的hash值相同呢,答案是重写hashCode()
方法,有意让不同的key的hash值相同
为了让代码出现极端情况,我们将所有的数字类型的key的hash值都设为1
,核心代码
@Override
public int hashCode() {
if (key == null) {
return 0;
}
Pattern pattern = Pattern.compile(REG);
// 所有数字,hashCode全部给1,为了复现碰撞极高, 且更容易树化(超过8)
if (pattern.matcher(key).matches()) {
return 1;
} else {
// 非数字
return 2;
}
}
开始
完整案例代码
package cn.com.suntree.utils.myself;
import java.util.HashMap;
import java.util.regex.Pattern;
public class Demo {
public static void main(String[]</