HashMap扩容机制

510 阅读1分钟
  1. jdk1.7及1.7之前,数组+链表
  2. jdK1.8之后,数组+链表+红黑树

未指定容量创建Hashmap时会在第一次添加元素时进行扩容

map.add(k,v)

PutVal函数

bc41333da285104478db02971220095.png

resize函数(扩容)

7d49d410606b1736d5628c82e1c3d79.png

7930bb6ff5b80df023c1b5c0c40a6f9.png 执行扩容和数组拷贝后返回到Putval()中

key不存在时

de52cf2a47aff77c6106b4970426f58.png

key存在时

33c0587d28a87ba76ed17de73affdb1.png

80d6a83637e0d0816ed226ddfd35f6f.png

当size>=threshold时,触发扩容

004b6831b91ceb18c8f778e887c1c1c.png

4505f452761e9a395d21ef6739655a3.png (n-1)&hash 减少哈希冲突并且n的长度必须为2的整数倍,目的:取模操作获得对应下标

数组拷贝时的三种情况

元素数组下标链表为空时

26f4ba2bb8fbed3996fa3b64b865af2.png

元素数组下标链表不为空时

e8c4f1d30a13fff1f821a007b58aa69.png

为红黑树时

ab811f8c41944304c880058f230496f.png 底层执行该方法,并会对数组进行检查,是否使用红黑树(红黑树的转换条件是链表长度大于等于8,并且数组的长度大于等于64)等