HashMap 基于哈希表实现。
-
存储结构:
- HashMap 使用数组来存储元素,每个数组元素称为桶。每个桶可以存储一个或多个键值对。桶的索引通过哈希函数计算得出。
-
哈希函数:
- 哈希函数用于将键映射到数组索引。在 Java 8 中,HashMap 使用了改进的哈希算法,旨在减小哈希冲突的概率。使用了键的哈希码的高位和低位异或的结果,以及扰动函数,以确保更好的分布。
-
链表和红黑树:
- 在每个桶中,HashMap 使用链表或红黑树来存储键值对。当桶中的元素数量超过一定阈值(默认为8并且数组的长度>64时(否则优先对数组进行扩容)),链表会转换为红黑树,以提高查找、插入和删除的效率。
-
扩容:
- 当 HashMap 的大小达到一定的阈值(负载因子,默认为0.75),HashMap 会进行扩容。扩容涉及重新计算哈希码、重新分配桶的索引,并将元素重新放置到新的桶中。扩容可以保持较低的负载因子,提高查询性能。