解析HashMap源码,直击面试痛点
2023-11-04 00:40:32
1. HashMap重要方法
HashMap提供了许多重要的方法,其中包括:
- put(key, value):将键值对添加到HashMap中。
- get(key):根据键获取值。
- remove(key):从HashMap中删除键值对。
- size():返回HashMap中键值对的数量。
- isEmpty():检查HashMap是否为空。
- containsKey(key):检查HashMap中是否包含指定的键。
- containsValue(value):检查HashMap中是否包含指定的值。
2. 加载因子为什么是 0.75?
HashMap的加载因子是一个阈值,当HashMap中键值对的数量超过该阈值时,HashMap将进行扩容。HashMap的默认加载因子是0.75,这意味着当HashMap中键值对的数量达到HashMap容量的75%时,HashMap将进行扩容。
加载因子为0.75的原因是,当HashMap的加载因子达到0.75时,HashMap的性能开始下降。这是因为当HashMap的加载因子较高时,HashMap中发生hash冲突的概率也更高。hash冲突是指两个或多个键具有相同的hash值,当hash冲突发生时,HashMap需要花费更多的时间来查找键值对。
3. 何时扩容
当HashMap中键值对的数量超过HashMap容量的加载因子时,HashMap将进行扩容。HashMap的扩容操作是通过创建一个新的HashMap,并将原有HashMap中的键值对复制到新的HashMap中。新的HashMap的容量是原有HashMap容量的两倍。
4. 何时转为红黑树,何时退化为链表
HashMap在处理hash冲突时,采用的是一种称为“链地址法”的策略。链地址法是指将具有相同hash值的键值对存储在同一个链表中。当链表中的键值对数量超过8个时,链表将被转换为红黑树。红黑树是一种具有良好性能的二叉搜索树,它可以提高HashMap的查找效率。
当红黑树中的键值对数量减少到6个或更少时,红黑树将退化为链表。这是因为当红黑树中的键值对数量较少时,红黑树的性能优势并不明显。
5. 为什么在解决hash冲突的时候,不直接用红黑树?而选择先用链表,再转红黑树
在解决hash冲突的时候,不直接用红黑树,而是选择先用链表,再转红黑树,主要有两个原因:
- 链表的实现更简单,效率更高。链表是一种线性数据结构,它的插入和删除操作都很简单。红黑树是一种复杂的数据结构,它的插入和删除操作都需要进行比较和旋转操作,因此效率较低。
- 当hash冲突发生时,链表中的键值对数量通常较少。在这种情况下,链表的性能优势更加明显。当链表中的键值对数量超过8个时,链表将被转换为红黑树,以提高HashMap的查找效率。