Java HashMap集合个人记录
HashMap 存放的是键值对信息,HashMap基于哈希表来实现的,是Java中常用的集合之一,是非线程安全的
HashMap的Key和Value都可以存储NULL,但是Key为NULL的情况下,只允许存在一个,而Value可以出现多个
在JDK1.8以前,HashMap是数组+链表组成的,数组是集合的主题,链表是为了解决哈希冲突而存在
1、哈希冲突
哈希冲突指的是计算出的地址被别的元素占用
为了解决哈希冲突,JDK1.8以前,HashMap中使用了拉链法,也就是将链表和数组相结合。创建一个数组,数组的每一格中都创建一个链表,如若碰到冲突的情况,将冲突的值,存放到当前地址的链表中
JDK1.8开始,HashMap就开始了转变
static final int TREEIFY_THRESHOLD = 8; //树形阈值
首先会调用treeifyBin()方法
1 final void treeifyBin(Node<K,V>[] tab, int hash) { 2 int n, index; Node<K,V> e; 3 if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY) 4 resize(); 5 else if ((e = tab[index = (n - 1) & hash]) != null) { 6 TreeNode<K,V> hd = null, tl = null; 7 do { 8 TreeNode<K,V> p = replacementTreeNode(e, null); 9 if (tl == null) 10 hd = p; 11 else { 12 p.prev = tl; 13 tl.next = p; 14 } 15 tl = p; 16 } while ((e = e.next) != null); 17 if ((tab[index] = hd) != null) 18 hd.treeify(tab); 19 } 20 }
判断当前数组是否为空或者数组长度是否小于容量64,如果空或数组长度小于64那么就会通过resize()方法进行扩容,反之,就会执行红黑树转换,replacementTreeNode(e, null) 方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通