Bootstrap

面试爽文 :开局一张图,花十分钟了解 HashMap 的树化逻辑

一. 前言

闲来无事,对 HashMap 其中比较重要的节点做了一下深入,然后尝试用最通俗易懂的说法输出出来。

老规矩 ,给节省时间的小伙伴上菜 :

image.png

二. HashMap 的树化

初级入门

之前面试别人的时候,就经常问这问题 ,问的比较多的一个点就是 HashMap 的树化 ,这个问题的标准答案也很简单 :

  • Java 1.8 之前 , HashMap 通过数组 + 链表的数据结构来处理哈希冲突。当多个键具有同一个哈希码时,他们会存储在一个哈希桶中,形成一个链表结构
  • Java 1.8 之后, 也是数组 + 链表,但是当链表的长度超过一定阈值后,会转变成红黑树结构,这个行为就叫树化

会了这两点,一般就认为对HashMap有一定了解了,初级就算过了,但是如果是中级就会稍微问多点

中级浅谈 :

  • 如何实现的链表?

每一个写入 HashMap 的对象会被封装到 Node 对象中,这个对象中有四个属性 ,其中一个属性同样是一个 Node 对象 ,用来指向链表中下一个 Node

java

复制代码

static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; // next 即为链表中下一个 Node Node<K,V> next; }
  • 如何实现的红黑树?

基于 TreeNode 对象实现, 该对象包含了 TreeNode-Left ,TreeNode-Right , TreeNode-Parent对象,用于实现树形结构

java

复制代码

// 实际每个 TreeNode 包含了数据信息 TreeNode extends Node { // 父节点 TreeNode parent; // 左子节点 TreeNode left; // 右子节点 TreeNode right; // 上一节点用于生成双向链表,便于树形操作 TreeNode prev; boolean red; }
;