💡
原文中文,约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) 不能完全避免扩容,可能在插入数据时仍会触发扩容。
➡️