01_HashMap
2021-03-18 10:39:29 1 举报
HashMap
作者其他创作
大纲/内容
(h = key.hashCode()) ^ (h >>> 16)
null
相同
h(hash值)
hash()
new HashMap()
HashMap
修改
key
是否需要扩容
key是否相同
hashCode()
//HashMap中几个重要参数/**实际存储的key-value键值对的个数*/transient int size;/**阈值,当table == {}时,该值为初始容量(初始容量默认为16);当table被填充了,也就是为table分配内存空间后,threshold一般为 capacity*loadFactory。HashMap在进行扩容时需要参考threshold,后面会详细谈到*/int threshold;/**负载因子,代表了table的填充度有多少,默认是0.75加载因子存在的原因,还是因为减缓哈希冲突,如果初始桶为16,等到满16个元素才扩容,某些桶里可能就有不止一个元素了。所以加载因子默认为0.75,也就是说大小为16的HashMap,到了第13个元素,就会扩容成32。*/final float loadFactor;/**HashMap被改变的次数,由于HashMap非线程安全,在对HashMap进行迭代时,如果期间其他线程的参与导致HashMap的结构发生变化了(比如put,remove等操作),需要抛出异常ConcurrentModificationException*/transient int modCount;
size >= threshold数组长度大于阈值
indexFor()
得到下标并存储
是
not null
node节点是否为空
当size超过临界阈值threshold,并且即将发生哈希冲突时进行扩容
h&(length-1)
hashCode
原数组key位置:1、不变2、原位置+原数组长度3、当红黑树长度<6时,转为链表存储
重新计算数组下标位置存储(原数组的数据也需要)
resize()扩容元数组长度*2
code节点为null直接存储
static final int hash(Object key) { int h; //高16位与低16位进行异或(^)运算,减少hash冲突 return (key == null) ? 0 :(h = key.hashCode()) ^ (h >>> 16); }
不同
找到链表中为null节点保存链表长度>8转为红黑树
收藏
0 条评论
下一页