HashMap源码解读

77 阅读1分钟

一、前提须知

image.png image.png Node数组,即哈希表。当第一次调用put()方法时初始化哈希表

image.png 哈希表初始化时的默认容量,为16

image.png 默认加载因子为0.75,即哈希表中存在元素的位置个数>0.75*哈希表长度时,扩容哈希表

image.png 树化阈值,当哈希表某位置上的链表长度>=8且哈希表长度>=64时,这个链表会被树化为红黑树

image.png 退树化阈值,当哈希表某位置上的红黑树节点数<=6时,这个红黑树会退化为链表

image.png 最小树化容量,即只有当哈希表长度>=64时,才有可能会树化。如果哈希表长度<64且某位置上的链表长度>=8,则扩容哈希表

image.png HashMap的静态内部类,Node类,即链表节点类

image.png HashMap的静态内部类,TreeNode类,即红黑树的节点类

二、核心代码 putVal()

1.putVal()方法的整体逻辑 image.png

2.tab=table 是将堆内的哈希表table复制到栈内存中,提高运行速度

将参数hash值与哈希表取余后得到一个位置,这个位置的头节点对象的地址复制给p

n为哈希表的长度

i为哈希表的下标 image.png