List和Set之间的性能和内存分配比较

Pri*_*shi 53 java collections list set

我想知道List和Set在性能,内存分配和可用性方面的比较.

如果我没有要求在对象列表中保持唯一性,则既不需要维护插入顺序,我可以交替使用ArrayList和SortedSet/HashSet吗?直接使用Collections类而不是列表/集合会不会很好?

PS我也不需要列表或设置java提供的特定功能.我只使用List/Set而不是Array,因为它们可以动态增长而无需额外的编程工作.

Lou*_*man 79

HashSet消耗的内存大约ArrayList是相同数量元素的5.5倍(尽管它们都是线性的),并且迭代速度明显较慢(尽管具有相同的渐近线); 一个快速的谷歌搜索建议HashSet迭代的速度减少2-3倍ArrayList.

如果您不关心其独特性或性能contains,请使用ArrayList.

  • 取决于您使用的是32位还是64位VM.也就是说,`HashSet`受到8字节引用的伤害比'ArrayList'更糟 - 基于链接的内存消耗图表,每个引用额外增加4个字节,每个元素带来'ArrayList`最多~12个字节,以及`HashSet`每个元素最多~52个字节.) (2认同)

NPE*_*NPE 48

如果您不关心排序,并且不删除元素,那么它实际上归结为您是否需要在此数据结构中查找元素,以及您需要多快查找这些元素.

在这一发现通过值的元素HashSetIS O(1).在一个ArrayList,它是O(n).

如果你只是使用容器来存储一堆独特的对象,并在最后(以任何顺序)迭代它们,那么可以ArrayList说它是更好的选择,因为它更简单,更经济.

  • 我假设"找到元素"他的意思是"包含". (17认同)
  • 在'ArrayList`中查找元素是`O(n)`?在`ArrayList`中找不到元素是通过索引直接访问吗? (4认同)
  • 在 HashSet 中按值查找元素是 O(1) 怎么办? (2认同)