缺乏底层知识的空中楼阁之——HashMap
HashMap是基于哈希表对Map接口的实现
当存在多个线程同时写入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) 进行与运算获得该对象的保留位以计算下标
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律