6. JDK 1.8 对 HashMap 进行了哪些改动,除了红黑树?

在 JDK 1.8 中,对 HashMap 进行了多项改进,除了引入红黑树来优化性能外,还有以下几个关键的改动:

优化了初始化方式: 在 JDK 1.7 及之前,HashMap 在初始化时会创建一个容量为16的数组,并将负载因子计算为0.75f。到了 JDK 1.8,HashMap 的初始化变得更加“懒惰”——在真正需要使用时才会分配数组空间,这样可以减少内存的浪费。

hash 函数的改进: 在 JDK 1.8 中,HashMap 的哈希函数进行了优化。JDK 1.8 使用了一个更复杂的位运算来混合原始的 hashCode 值,这样做的目的是为了减少哈希冲突,使得元素更加均匀地分布在桶中,从而提高访问性能。

链表转红黑树的条件调整: 在 JDK 1.8 中,当链表长度超过8且 HashMap 的桶的数量超过 64 时,会将链表转换为红黑树,以提升查找和删除操作的效率。如果桶的数量少于64,则会选择扩容而不是转换为红黑树。这是为了在空间和时间之间找到一个平衡点,避免不必要的红黑树转换开销。

增强并发性支持: JDK 1.8 对并发性的处理也进行了改进。在并发情况下,HashMap 现在减少了整个表的锁定,而是仅锁定特定的桶,这样就可以允许更高的并发度。这一变化虽然没有完全解决 HashMap 的线程安全问题,但确实在某些场景下提高了性能。

这些改动的整体目标是提升 HashMap 在高并发环境中的性能和效率,同时降低内存的浪费。这些改进使得 JDK 1.8 版的 HashMap 能够更好地应对不同的使用场景,尤其是在处理大规模数据和高并发访问时表现更加优异。

你可能感兴趣的:(面试题java集合,java,jvm,开发语言)