java - Java 中的小集合 : which datastructure?

标签 java set

是否有关于小型 集合(例如 1-100 个元素)的各种 Java 集合实现的性能的任何好的引用,或者有人可以告诉我更多相关信息吗? O(1) vs O(log n) 的故事与这些大小几乎无关,但由于我需要处理数百万个这样的小集合,性能当然很重要。我发现的大多数引用文献都没有过多提及这一点。

我需要对这些集合执行以下操作(通常每组只需执行几次):

  • 初始化一套新的和/或硬拷贝一套旧的
  • 添加/删除元素
  • 遍历集合
  • 计算hashCode()整组的

我认为这些是比较可行的选项(假设比较/散列 T 几乎是免费的):

  • HashSet:似乎不擅长迭代(因此在 hashCode() )
  • TreeSet:开销似乎高得离谱
  • LinkedHashSet:完全没有这方面的经验,开销大吗?
  • ArrayList:本身很快但不是一个集合,像Collections.sort()这样丑陋的技巧需要...

通常首选以上哪项?或者我应该自己写 SmallSet<T>类(class)?

最佳答案

如果你真的在寻找性能,那么没有什么比自己测试更能帮助你的了:

  • 您是否不断地为它们分配新的资源?如果是这样,垃圾收集可能比其他情况更有意义
  • 您是否只分配了一次并需要快速访问?哈希碰撞将对此产生影响
  • 您是否经常更改它们?

您需要设置一个与您的实际使用类似的测试用例 - 测试足够长的时间以便 GC 启动,然后您会看到效果。

如果您检测到它们之间的关键差异,请在每次更新 JVM 后重新运行测试,因为实现可能会发生变化。

在您完成此类性能测试之前,我将给出我的标准建议:选择可读性最好的选项,并且只有在使用较差的可读性有明显好处时才更改它。代码维护者(可能是 future 的你)会为此感谢你。

关于java - Java 中的小集合 : which datastructure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12346594/

相关文章:

Java selenium 无法发送按键和单击元素

java - 如何使用 java 中的正则表达式或子字符串从字符串中提取文本?

java - 仅使用其中两个属性从排序集中查找并删除元素

java - Hibernate - 在为对象设置属性时避免冗余查询

c++ - 有没有办法交叉/区分 std::map 和 std::set?

java - 使用变量名称标记形状的 2D 图形

Java HtmlUnit form.getInputByValue ("Login Now!").click();

java - 使用派生的 AbstractSingleBeanDefinitionParser 或其他方法在 BeanPostProcessor 中配置类

python - 2 组并集不包含所有项目

python - 字典、集合还是卡住集合?