实时输出Java8 HashMap数据结构
创始人
2024-02-09 20:58:34

看过 Java 8 HashMap 源码的知道底层数据结构是数组、链表和红黑树实现的,从Debug调试或者序列化输出的都是K,V值,没法直观的看到上述的数据结构,为了直观的看到数据结构存储方面的变化,本文通过动图演示HashMap的结构变化。

为了简单看出链表到红黑树的变化,定义一个方便控制的key来演示效果。

public class Key implements Comparable{private final int hash;private final int value;public Key(int hash, int value) {this.hash = hash;this.value = value;}@Overridepublic int compareTo(Key o) {return (value < o.value) ? -1 : ((value == o.value) ? 0 : 1);}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Key key = (Key) o;if (hash != key.hash) return false;return value == key.value;}@Overridepublic int hashCode() {return hash;}
}

上面通过 hashCode 直接返回 hash 简单控制值落在数组中的位置,重写的 equals 中通过不同的 value 值保证为不同的 Key,通过 compareTo 比较 value 值,让红黑树可以更直观的展示。

通过下面代码创建一个 hash = 0,value自增的 Key

 public static void main(String[] args) throws Exception {HashMap map = new HashMap<>();int valueSize = 20;for (int i = 0; i < valueSize; i++) {clearScreen();System.out.println("---------------------------------------------");printTableLength("table.length before put: ", map);map.put(new Key(0, i), i);printTableLength("table.length after put : ", map);print(map);}
}

通过 clearScreen() 实现 CMD 清屏的效果,通过 printTableLength("table.length before put: ", map); 打印 HashMapNode[] table 数组的长度,当调整长度 resize 时,就会产生变化。通过 print(map) 输出 HashMap 的结构。上述代码执行过程中的关键输出如下:

---------------------------------------------
table.length before put: 0
table.length after put : 16
table[0] printmap.MapTest$Key@0 -> 0
---------------------------------------------
table.length before put: 16
table.length after put : 16
table[0] printmap.MapTest$Key@0 -> 0 -> 1
---------------------------------------------
省略...

下面开始,当链表长度超过8时,会转换树,转换树时会判断 table数组的长度是否超过64,由于此时长度为16,会先通过 resize 扩容来避免hash冲突。

链表长度10的时候,由于数据大小32,会先resize扩容,所以就出现了链表长度为 10 的特殊情况。

---------------------------------------------
table.length before put: 16
table.length after put : 32
table[0] printmap.MapTest$Key@0 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8
---------------------------------------------
table.length before put: 32
table.length after put : 64
table[0] printmap.MapTest$Key@0 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9

等到下一次的时候,链表长度超过8,数组到了64,链表就转换为了红黑树(树形结构中B为黑,R为红)。

---------------------------------------------
table.length before put: 64
table.length after put : 64
table[0] printmap.MapTest$Key@0
│               ┌── R:10
│           ┌── B:9
│           │   └── R:8
│       ┌── R:7
│       │   └── B:6
│   ┌── B:5
│   │   └── B:4
└── B:3│   ┌── B:2└── B:1└── B:0
---------------------------------------------
省略...
---------------------------------------------
table.length before put: 64
table.length after put : 64
table[0] printmap.MapTest$Key@0
│                   ┌── R:18
│               ┌── B:17
│               │   └── R:16
│           ┌── R:15
│           │   └── B:14
│       ┌── B:13
│       │   └── B:12
│   ┌── R:11
│   │   │   ┌── B:10
│   │   └── B:9
│   │       └── B:8
└── B:7│       ┌── B:6│   ┌── B:5│   │   └── B:4└── R:3│   ┌── B:2└── B:1└── B:0

上图是最终状态的树。下面的动图为完整的慢速执行过程:

在这里插入图片描述

想要源码吗? 捐赠留下邮箱稍后即可收到。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...