Java 哈希集性能

标签 java performance hashset

我理解基于HashMapHashSet,因为它们非常相似。它使代码更加灵活,并最大限度地减少了实现工作。但是,如果类禁止 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/

相关文章:

java - 列表到哈希集

java - 如何在java中处理模型验证和一致性检查

java - 如何防止 JFrame 关闭

mysql - 在大型表上使用多个 where 条件提高 mysql 查询的性能

Java Hashset.contains() 产生神秘的结果

java - 如何根据这些条件对对象的 HashSet 进行排序?

java - 无法从静态上下文中引用非静态方法

java - 在 Imagej 插件中,如何使 ROI 可用或作为选择 Activity

arrays - 数组中的差异总和

performance - calcOpticalFlowSF 的更快替代方案