HashMap、HashTable、ConcurrentHashMap理解
# HashMap底层分析
HashMap底层是数组加链表,在JDK1.8之后加入了红黑树。
有两个重要的概念:容量和负载因子
容量默认是16,负载因子默认是0.75
扩容的前提条件是:
- 发生冲突
- 容量达到当前的最大值
在 JDK1.8 中对HashMap进行了优化: 当 hash 碰撞之后写入链表的长度超过了阈值(默认为8)并且table 的长度不小于64(否则扩容一次)时,链表将会转换为红黑树。
为什么用数组加链表的形式
数组是用来确定桶的位置,利用元素的key的hash值对数组长度取模得到
链表是用来解决hash冲突问题,当出现hash值一样的情形,就在数组上的对应位置形成一条链表。ps:这里的hash值并不是hashcode,而是将hashcode高低16位异或过的
解决冲突的方式:链地址法
大意就是当发生冲突的时候,会将hashcode相同的数以链表的形式存起来,JDK1.7采用的是头插法,这样会存在一个问题,就是会导致死循环,JDK1.8之后,采用的是尾插法,这样可以解决链表死循环问题
有待更新

浙公网安备 33010602011771号