java8源码详解--HashMap-put逻辑
2018-03-11 15:24
609 查看
HashMap原理总结
标签: java8源码欢迎 start
1.
Node<K,V>[] table;这个就是存储数据的成员变量 table.
2.
Node<K,V>内部类构造:
static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; Node(int hash, K key, V value, Node<K,V> next) { this.hash = hash; this.key = key; this.value = value; this.next = next; } // ······具体的方法实现没有贴上来. }
3.下面讲述这个
put(K key,V value)逻辑.
put(K key ,V value); 1. 通过 key 的 hash 值,经过特定运算,得到一个 int 类型的值,并作为 table 数组的 下标 index. i. 这里需要注意的是,两个不同的 key 可能经过特定运算后,会得到相同的值。所 以,table数组 类型是一个 Node<K,V> 的链表结构. 2.计算得到下标值(index)之后.进行判断. i.若table[index] == null -直接新建一个Node<K,V> 对象 e ,并赋值.即,table[index] = e; ii.若table[index] != null (说明该key计算出的下标index对应的值,已经存在.造成的原因是: 1.两个相同的key,计算后,得到相同index,造成 table[index] != null. 2.两个不同的key经过特定运算之后,得到相同的index,因此,table[index] != null.) -若是情况1<key相同,index相同>,则会把该index对应的Node的value 用新传进来的value进行覆盖. -若是情况2<key不同,index相同>,则会判断该index下的Node链表 是否为 treeNode. *若该Node是treeNode,则直接红黑树插入键值对. *若该Node不是treeNode,则遍历列表. ^如果该链表长度大于8,则把该链表改成红黑树插入键值对. ^如果该链表长度不大于8,直接插入。若key存在,则直接覆盖value 3.把map的size + 1; 并判断是否是否需要扩容 i.需要,则进行扩容,结束. ii.不需要,则结束.
相关文章推荐
- Java 1.8 HashMap 源码中 put()方法详解
- 深入Java基础(四)--哈希表(1)HashMap应用及源码详解
- java 8 Hashmap深入解析 —— put get 方法源码
- java hashmap源码学习二 put&get
- Java集合2-HashMap详解(含源码分析)
- java hashmap的put函数实现源码
- 【Java入门提高篇】Day23 Java容器类详解(六)HashMap源码分析(中)
- 【Java】HashMap源码分析——常用方法详解
- java中HashMap详解(从源码角度看内部实现)
- java_集合体系之HashMap详解、源码及示例——09
- java 8 Hashmap深入解析 —— put get 方法源码
- java集合13--WeakHashMap源码详解
- Java中HashMap详解 - HashMap源码及实现原理
- Java集合:HashMap使用详解及源码分析
- java_集合体系之WeakHashMap详解、源码及示例——11
- java 8 Hashmap深入解析 —— put get 方法源码
- java 8 Hashmap深入解析 —— put get 方法源码
- Java集合详解四:HashMap源码详解
- java8源码详解--HashMap
- 【Java入门提高篇】Day22 Java容器类详解(五)HashMap源码分析(上)