HashMap
HashMap是基于哈希表对Map接口的实现
HashMap提供所有可选的映射操作,允许使用空键空值 new HashMap<>().put(null,null)
当存在多个线程同时写入HashMap时,可能会导致数据的不一致
HashMap的底层实现:
loadFactor threshold size modCount INITLAL_CAPACITY
HashMap的存储结构:数组+链表+红黑树(jdk 1.8)
每个Node节点存储着用来定位数据索引位置的hash值,k键,v值以及指向链表下一个节点的Node<k,v> next节点组成
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
}
Node是HashMap的内部类,实现了Map.Entry接口,本质是一个键值对
如何确定Node的存储位置?
以添加Key键为字符'e'为例:
static final int hash(Object key){
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
HashMap首先调用hashCode() 方法,获取键key的hashCode值h(101),然后对其进行高位运算:
将右移16位以取得h的高16位,与原h的低16位进行异或运算 (结果为101)
最后将得到的h值与 (table.length - 1) 进行与运算获得该对象的保留位以计算下标
标签:Node,hash,HashMap,16,hashCode,key,空中楼阁,底层 From: https://www.cnblogs.com/legends-61/p/17823613.html