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