HashMap源码解析思维导图

HashMap源码解析思维导图_第1张图片


常见面试题目


HashMap和TreeMap区别

HashMap
  • 数组加链表方式存储key/value
  • 线程非安全
  • 允许null作为key和value
  • key不可以重复,value允许重复,
  • 不保证元素迭代顺序是按照插入时的顺序;
TreeMap
  • 基于红黑树
  • 线程非安全
  • 不允许null作为key
  • key不可以重复,value允许重复
  • 存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口才能按照排序后的顺序遍历元素
JDK 1.8 HashMap 扩容时做了哪些优化

JDK 1.8 在扩容时并没有像 JDK 1.7 那样,重新计算每个元素的哈希值,而是通过高位运算(e.hash & oldCap)来确定元素是否需要移动,

使用 e.hash & oldCap 得到的结果,高一位为 0,当结果为 0 时表示元素在扩容时位置不会发生任何变化,

使用 e.hash & oldCap 得到的结果,高一位为 1,表示元素在扩容时位置发生了变化,新的下标位置等于原下标位置 + 原数组长度

加载因子为什么是 0.75

空间和时间效率的一个平衡,默认选择0.75 作为加载因子

当加载因子设置比较大的时候,扩容的门槛就被提高了,扩容发生的频率比较低,占用的空间会比较小,但此时发生 Hash 冲突的几率就会提升,因此需要更复杂的数据结构来存储元素,这样对元素的操作时间就会增加,运行效率也会因此降低;

而当加载因子值比较小的时候,扩容的门槛会比较低,因此会占用更多的空间,此时元素的存储就比较稀疏,发生哈希冲突的可能性就比较小,因此操作性能会比较高。

当有哈希冲突时,HashMap 是如何查找并确认元素的?

JDK 1.7 时 HashMap 是由数组和链表组成的,

JDK 1.8 则新增了红黑树结构,当链表长度达到 8 并且容器达到 64 时会转换为红黑树存储,以提升元素的操作性能

HashMap 底层数组的长度总是2的n次方,这是HashMap在速度上的优化。 当 length 总是2的n次方时,hash & (length-1)运算等价于对 length 取模,也就是 hash%length 但是&比%具有更高的效率。比如 n % 32 = n & (32 -1)

你可能感兴趣的:(java,hashmap,源码分析,思维导图)