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

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

 

posted @   央隹  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示