一、HashMap
1. 什么是HashMap?
HashMap内部是了一个存储数据的Entry数组(每个元素都是一个key-value对),HashMap采用链表解决哈希冲突,每一个Entry本质上是一个单向链表。当数组容量不足时,会自动扩容。

hashMap.png
2. HashMap中添加元素的过程

HashMap的put方法.png
- 当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,也就是数组的索引index。
- 链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中。
- HashMap内存储数据的Entry数组默认是16,如果没有对Entry扩容机制的话,当存储的数据一多,Entry内部的链表会很长,这就失去了HashMap的存储意义了。所以HasnMap内部有自己的扩容机制。
(1)变量size,它记录HashMap的底层数组中已用槽的数量
(2)变量threshold,它是HashMap的阈值,用于判断是否需要调整HashMap的容量(threshold = 容量*加载因子)
(3)HashMap扩容的条件是:当size大于threshold时,对HashMap进行扩容
二、HashMap和HashTable的区别
- HashMap线程不安全,HashTable线程安全(synchronized)
- HashMap允许key和value同时为null,HashTable不允许null值(key和value都不可以)
三、HashTable和ConcurrentHashMap的区别
- HashTable是做了同步,HashMap没有考虑同步。单线程情况下,HashMap的效率较高。在多线程情况下,同步操作能够保证程序执行的正确性,但是HashTable每次同步执行的时候都要锁住整个结构,效率很低。
-
ConcurrentHashMap
多线程情况下,线程安全,效率比HashTable高。
HashTable和ConcurrentHashMap.png
