HashMap 是底层结构是数组 + 链表,数组是存放 Node(Entry)的数组 Entry[],链表是 Node 组成的链表,充分利用了 Node 的特性。链表的头结点存放在数组中。
put 方法的大致思路
- 调用 hash(key) 方法,根据 key 对象的 hashCode 计算出 kay 的 hash,根据 hash 计算出其在 tab 数组中的 index,将键和值放入 Node(Entry) 中;
- 如果 index 位置的 Node 为空,称为没碰撞,直接 Node 放入数组中;
- 如果碰撞(index 位置存在 Node),先跟头结点比较,key 不相等时,循环链表比较,如果 key 已经存在,替换 old value,否则将 Node 链接到链表最后。
- 如果碰撞导致链表的长度大于等于 7,将链表的结构转换为红黑树。
- 如果 bucket 存放的 current capacity(当前容量)超过容量的 load factor(0.75),就 resize,容量扩大为两倍。
源码分析
public V put(K key, V value) { |
测试代码
public static void main(String[] args) { |