目录
一、HashMap、HashTable、ConcurrentHashMap的原理
二、HashMap、HashTable和ConcurrentHashMap的区别。
相关文章:
HashTable和HashMap的区别详解(很详细 9w阅读量 157赞 简略版答案主要根据此篇文章进行总结)
HashMap 与HashTable的区别(很详细 10w阅读量 66赞)
【Java集合源码剖析】Hashtable源码剖析(很详细)
Java集合源码剖析(系列文章 8篇)
面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别(简略)
面试题:HashMap的原理、HashTable和HashMap的区别详解(自己的 一些转载文章)
数据结构六:HashMap (自己的 源码分析,较为详细)
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
问题分析:
一般来说,这三个东西基本在面试中 70% 会被问到,而问的方向也不太一样。比如初级的问法是讲讲它们之前的区别,这个我想没什么难度,大多数人还是知道主要核心区别是并发上的处理。此外,内部数据结构的实现、扩容、存取操作这些问题应该是很老生常谈了,这并没有什么好说的,大多数人也都知道。稍微问的深一点的可能会在下面这些点上出问题。哈希碰撞,哈希计算,哈希映射,为什么是头插法,扩容为什么是 2 的幂次等这样的问题。
可以分解为多个问题:
一、HashMap、HashTable、ConcurrentHashMap的原理
二、HashMap、HashTable、ConcurrentHashMap的区别
三、内部数据结构的实现、扩容、存取操作
四、哈希碰撞、哈希计算、哈希映射
五、为什么是头插法?扩容为什么是2的幂次
concurrent 美 [kənˈkɜːrənt] 同时发生的
〇、文档资料
JDK1.8文档中,关于Hashtable的描述:
Hashtable从JDK1.0开始,而从JDK1.2开始,这个类被改造为实现Map接口,使其成为Java Collections Framework。与新的集合实现不同, Hashtable是同步的。 如果不需要线程安全的实现,建议使用HashMap代替Hashtable 。 如果需要线程安全的并发实现,那么建议使用ConcurrentHashMap代替Hashtable 。
因此,在实际开发中,其实是用不到Hashtable的,只是在面试中常被拿来用而已。
一、HashMap、HashTable、ConcurrentHashMap的原理
面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别
HashTable
- 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化
- 初始size为11,扩容:newsize = olesize*2+1
- 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length
HashMap
- 底层数组+链表实现,可以存储null键和null值,线程不安全
- 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂
- 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入
- 插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)
- 当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀
- 计算index方法:index = hash & (tab.length – 1)