缺乏底层知识的空中楼阁之——HashMap

发布时间 2023-11-10 11:03:26作者: 央隹

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) 进行与运算获得该对象的保留位以计算下标