HashMap、HashTable、ConcurrentHashMap理解

# HashMap底层分析

HashMap底层是数组加链表,在JDK1.8之后加入了红黑树。
有两个重要的概念:容量和负载因子
容量默认是16,负载因子默认是0.75
扩容的前提条件是:

  1. 发生冲突
  2. 容量达到当前的最大值

在 JDK1.8 中对HashMap进行了优化: 当 hash 碰撞之后写入链表的长度超过了阈值(默认为8)并且table 的长度不小于64(否则扩容一次)时,链表将会转换为红黑树。

为什么用数组加链表的形式

数组是用来确定桶的位置,利用元素的key的hash值对数组长度取模得到
链表是用来解决hash冲突问题,当出现hash值一样的情形,就在数组上的对应位置形成一条链表。ps:这里的hash值并不是hashcode,而是将hashcode高低16位异或过的

解决冲突的方式:链地址法

大意就是当发生冲突的时候,会将hashcode相同的数以链表的形式存起来,JDK1.7采用的是头插法,这样会存在一个问题,就是会导致死循环,JDK1.8之后,采用的是尾插法,这样可以解决链表死循环问题


有待更新

posted @ 2020-03-20 16:26  code-4-fun  阅读(141)  评论(0)    收藏  举报