Java HashMap put()方法
发布网友
发布时间:2024-10-20 15:40
我来回答
共1个回答
热心网友
时间:2024-11-26 03:38
这里简要回顾几个运算符号:
>>>(无符号右移),其特点为:正数右移后仍为正数,负数右移后转为正数。
^(按位异或),两个二进制数参与运算,位值相同则为0,不同则为1。
这一步骤的目的在于,将key的哈希值与无符号右移16位的值进行异或运算,从而使哈希值更加分散,减少哈希冲突的可能性。
首先,调用putVal()方法,在首次调用时对table数组进行初始化。默认情况下,table数组的长度为16。
通过将哈希值与(数组长度-1)进行&运算,得到一个数组下标i。如果下标i位置没有元素,直接添加。
若待添加数据的哈希值与下标i位置的元素哈希值相同,并且equals()方法返回true,则替换当前元素的value值。
如果下标i位置的Node对象是一个红黑树节点,则将key和value封装成一个红黑树节点,并添加到红黑树中。在此过程中,还会判断红黑树中是否存在当前key,如果存在则更新相应的value。
如果下标i位置的Node对象是一个链表节点,则进行遍历。若发现哈希值相同且equals()返回true的节点,则更新相应的value,否则将key与value封装成一个链表节点,添加到链表尾部。
链表树化的条件是:table数组的长度大于等于64,且链表长度大于8。