HashMap的初始容量设置

HashMap的初始容量设置

💡 原文中文,约4200字,阅读约需10分钟。
📝

内容提要

在Java中,设置HashMap的初始容量非常重要。若已知大小,建议使用`Maps.newHashMapWithExpectedSize(expectedSize)`以避免扩容,从而提升性能。

🎯

关键要点

  • 在已知大小的情况下,建议使用 Maps.newHashMapWithExpectedSize(expectedSize) 来设置 HashMap 的初始容量,以避免扩容。
  • HashMap 的扩容操作时间复杂度为 O(n),空间复杂度为 O(n),并且需要计算对象的 hash。
  • 当 Node 数量超过阈值时(loadFactor * capacity),HashMap 会触发扩容,默认 loadFactor 为 0.75。
  • 使用 Maps.newHashMapWithExpectedSize 方法可以避免扩容问题,因为它内部会根据预期大小计算合适的初始容量。
  • HashSet 也有类似的方法,可以使用 Sets.newHashSetWithExpectedSize(expectedSize) 来避免扩容。

延伸问答

为什么在已知大小的情况下要使用 Maps.newHashMapWithExpectedSize 方法?

使用 Maps.newHashMapWithExpectedSize 方法可以避免 HashMap 的扩容,从而提升性能。

HashMap 扩容的时间复杂度和空间复杂度是多少?

HashMap 扩容的时间复杂度为 O(n),空间复杂度也为 O(n)。

HashMap 的扩容是如何触发的?

当 Node 数量超过阈值(loadFactor * capacity)时,HashMap 会触发扩容,默认 loadFactor 为 0.75。

如何计算 HashMap 的初始容量以避免扩容?

初始容量应设置为 Math.ceil(expectedSize / 0.75),以确保在达到阈值之前不会扩容。

除了 HashMap,还有哪些数据结构可以使用类似的方法避免扩容?

HashSet 也有类似的方法,可以使用 Sets.newHashSetWithExpectedSize(expectedSize) 来避免扩容。

使用 HashMap 时,为什么直接使用 new HashMap<>(expectedSize) 不合适?

直接使用 new HashMap<>(expectedSize) 不能完全避免扩容,可能在插入数据时仍会触发扩容。

➡️

继续阅读