Java集合面试题, 为什么 HashMap 在 Java 中扩容时采用 2 的 n 次方倍?
Java集合面试题, 为什么 HashMap 在 Java 中扩容时采用 2 的 n 次方倍?
QA
Step 1
Q:: 为什么 HashMap 在 Java 中扩容时采用 2
的 n 次方倍?
A:: HashMap在Java中采用2的n次方倍进行扩容是为了保证其高效性。在HashMap中,键值对是通过哈希值进行存储的,当发生哈希冲突时,需要将这些键值对分配到相应的桶(bucket)中。采用2的n次方倍作为容量,可以使哈希值的低位和容量-1
进行与操作时,分布更均匀,从而减少哈希冲突。并且,这样可以快速地通过位运算(取模)计算出元素存储的位置。
Step 2
Q:: HashMap的默认初始容量和加载因子是多少?
A:: HashMap的默认初始容量是16,默认加载因子是0.75
。初始容量决定了HashMap在创建时可以存储多少个键值对,加载因子决定了HashMap何时需要扩容。当HashMap中的键值对数量达到容量与加载因子的乘积时,就会触发扩容操作。
Step 3
Q:: HashMap的工作原理是什么?
A:: HashMap使用哈希表来存储键值对。每个键值对存储在一个Entry对象中,通过计算键的哈希值,将其存储到相应的桶中。如果发生哈希冲突(即多个键的哈希值相同),HashMap会采用链地址法,将这些键值对存储在同一个桶中的链表或红黑树中。
Step 4
Q:: HashMap和Hashtable的区别是什么?
A:: HashMap和Hashtable都是基于哈希表的数据结构,但它们有一些重要的区别:1) HashMap是非线程安全的,而Hashtable是线程安全的;2) HashMap允许一个null键和多个null值,而Hashtable不允许null键或null值;3)
HashMap的性能通常优于Hashtable,因为它不需要进行同步。
Step 5
Q:: 如何解决HashMap中的哈希冲突?
A:: 在HashMap中,哈希冲突是通过链地址法来解决的,即将具有相同哈希值的键值对存储在同一个桶中的链表或红黑树中。在Java 8之后,当链表长度超过一定阈值(默认为8
)时,链表会转换为红黑树,以提高查询效率。