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) 方法

posted @   将军本就不是什么将军  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示