P8 Java 13中 HashMap的 put方法
2021-02-03 22:18
标签:nal treenode 插入 自己 next style 指定位置 一个 new HashMap的put方法执行过程可以通过下图来理解(摘自某大厂的博客,推荐从参考文献的链接去查看原文),自己有兴趣可以去对比源码更清楚地研究学习。 ①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容; ②.根据键值key计算hashCode值进而求得元素的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥;否则,转向③; ③.判断table[i]的首个元素是否和key一样,如果相同直接覆盖value;否则,转向④,这里的相同指的是hashCode以及equals; ④.判断table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对;否则,转向⑤; ⑤.遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作;否则,进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可; ⑥.插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。 Java 8 中,HashMap的实现相比于Java 7做了很大的改变,但是,从Java 8 到 Java 13 ,其实现并未改变,下面分析 Java 13中 HashMap Put函数源码: 分析: 1 数组tab为null或为空?若是,则resize(); 2计算key的hash值i,若tab[i]==null,新建节点;否则,转入3 3 判断首节点处理hash冲突的方式是链表还是红黑树(check第一个节点类型),分别处理。 例如,使用链表处理时,利用Node类的next变量来实现链表,把最新的元素放到链表头,旧的数据则被最新元素的next变量引用。 桶的树形化 treeifyBin() https://zhuanlan.zhihu.com/p/21673805 P8 Java 13中 HashMap的 put方法 标签:nal treenode 插入 自己 next style 指定位置 一个 new 原文地址:https://www.cnblogs.com/east7/p/12797601.htmlPut函数源码解析
/**
* 链表转为红黑树的临界值
*/
static final int TREEIFY_THRESHOLD = 8;
/**
* 红黑树退化为链表的临界值
*/
static final int UNTREEIFY_THRESHOLD = 6;
// 构造函数 put
public V put(K key, V value) {
// 对key的hashCode()做hash
return putVal(hash(key), key, value, false, true);
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {
Node
//将桶内所有的 链表节点 替换成 红黑树节点
final void treeifyBin(Node
Reference
下一篇:php简单日志写入函数
文章标题:P8 Java 13中 HashMap的 put方法
文章链接:http://soscw.com/index.php/essay/50620.html