java8中HashMap扩容机制-结点的挂载
HashMap简介+成员变量
1.HashMap在底层数据结构上采用的是 :数组+链表+红黑树,通过散列映射储存键值对数 据,故查询时访问速度比较快;HashMap最多允许一对键值对的key值为null,允许多对键值对的value为null;排列无序,非线程安全。
2.Node<K,V>:链表的节点,包含了key,value,hash,next 四个元素。
3. size:记录元素的个数。
4.table:Node<K,v>类型的数组,里面元素为链表,储存元素。
5.LoadFactor:负载因子(0.75)。
6.threshold:阀值,决定HashMap在什么时候进行扩容,以及扩容后的大小。阀值=容量*负载因子
put方法
自己实现put方法代码,,仅仅适用于无扩容情况时,如下:
/**
* 添加数据
*/
@Override
public void put(K key, V value) {
int index = (key == null) ? 0 : key.hashCode() % table.length;// 数组的索引
Entry<K, V> data = new Entry<>(key, value);
Node<K, V> newNode = new Node<>(data, null);
if (table[index] == null) {
// 空链表无节点
table[index] = newNode;
} else {
Node<K, V> tmp = table[index];
while (tmp != null && tmp.next != null) {
// 尾插法
if (tmp.data.getKey() == key || tmp.data.getKey().equals(key)) {
tmp.data.setValue(value);
return;
}
tmp=tmp.next;
}
if (tmp.data.getKey() == key || tmp.data.getKey().equals(key)) {
tmp.data.setValue(value);
return;
}
tmp.next = newNode;
}
this.size++; // 容量大小+1
}
源码如下:
final V putVal(int hash