Java 哈希集性能
Java HashSet performance
我根据 HashMap
理解 HashSet
,因为它们非常相似。它使代码更加灵活,并最大限度地减少了实施工作。但是,如果 class 禁止 null
元素,HashSet 的 Entry
中的一个引用变量对我来说似乎是不必要的,因此整个 Entry 没有意义。尽管如此,Entry
需要 24 字节内存/元素,而如果我的数字是正确的,则包含集合元素的单个数组只需要 4 字节/元素。 (除了数组的 header)
如果我的论点是正确的,那么这些优势真的会影响性能吗?
(如果我错了,我也会吸取教训)
虽然这个问题主要是基于意见的,但我将就这个主题总结几点:
HashSet
出现在 Java 1.2 许多年前。现在很难猜测当时做出设计决策的确切原因,但显然 Java 并未用于高负载应用程序;性能的作用不如简单性。
- 你是对的,
HashSet
在内存消耗方面不是最理想的。这个问题是已知的,bug JDK-6624565 is registered, and discussions at core-libs-dev 不时举行。但这是许多现实世界应用程序的障碍吗?应该没有。
- 对于那些
HashSet
内存使用不可接受的不常见应用程序,已经有很好的替代方案,例如 trove THashSet。
- 请注意,开放寻址算法有其缺点,例如负载因子接近 1 时性能显着下降;元素去除困难。见 related answer.
我根据 HashMap
理解 HashSet
,因为它们非常相似。它使代码更加灵活,并最大限度地减少了实施工作。但是,如果 class 禁止 null
元素,HashSet 的 Entry
中的一个引用变量对我来说似乎是不必要的,因此整个 Entry 没有意义。尽管如此,Entry
需要 24 字节内存/元素,而如果我的数字是正确的,则包含集合元素的单个数组只需要 4 字节/元素。 (除了数组的 header)
如果我的论点是正确的,那么这些优势真的会影响性能吗?
(如果我错了,我也会吸取教训)
虽然这个问题主要是基于意见的,但我将就这个主题总结几点:
HashSet
出现在 Java 1.2 许多年前。现在很难猜测当时做出设计决策的确切原因,但显然 Java 并未用于高负载应用程序;性能的作用不如简单性。- 你是对的,
HashSet
在内存消耗方面不是最理想的。这个问题是已知的,bug JDK-6624565 is registered, and discussions at core-libs-dev 不时举行。但这是许多现实世界应用程序的障碍吗?应该没有。 - 对于那些
HashSet
内存使用不可接受的不常见应用程序,已经有很好的替代方案,例如 trove THashSet。 - 请注意,开放寻址算法有其缺点,例如负载因子接近 1 时性能显着下降;元素去除困难。见 related answer.