为什么Java提供Set
类型的几种不同实现,包括HashSet
和TreeSet
以及 不 {{1 }}?
答案 0 :(得分:17)
仅基于无特定顺序的元素数组的集合将始终具有O(n)时间用于包含检查。它不会非常有用,IMO。您何时想而不是HashSet
或TreeSet
使用?
数组最有用的方面是您可以非常快速地访问具有特定索引的元素。当谈到集合时,这并不是非常相关。
答案 1 :(得分:10)
CopyOnWriteArraySet是一个由数组支持的集合。
这不是特别有用,因为它的性能对于大型集合来说并不是很好。
答案 2 :(得分:2)
Set
接口没有get-by-index方法,例如List.get(int)
,所以没有使用数组支持的Set。
最终,所有“分组”类都使用引擎盖下的数组来存储它们的元素,但这并不意味着你必须公开访问数组的方法。
答案 3 :(得分:2)
实际上Set的具体实现没有任何意义。任何集合都存储元素并保证它们的独特性。
我不能确定,但听起来你想要Set实现保留元素的顺序。如果我正确使用LinkedHashSet
。
答案 4 :(得分:2)
Android有android.util.ArraySet(在API级别23中引入)和android.util.ArrayMap(在API级别19中引入)。
答案 5 :(得分:1)
Java提供了Collection
接口的多种实现,可实现最佳性能。 ArrayList
在许多List
次操作中表现良好。
对于Set
操作,这些操作总是需要单一性,不同的实现提供了更好的性能。如果使用数组实现,则任何修改操作都必须遍历所有数组元素以检查它是否已在Set中。 HashSet和TreeSet简单地检查了这一点。
答案 6 :(得分:0)
你总是可以自己实现....现在授予它可能只有一个非常极其有限的情况,它会有用(在这种情况下,你可以使用更好的数据结构),这就是你有一个非常大的集合几乎永远不会改变,然后一个数组集将占用更少的内存(没有额外的指针),你会有如此快的枚举整个集...如果你保持数组排序,那么你仍然可以得到O (lg n)搜索时间。
然而,这些差异纯粹是学术性的。在现实世界中,你永远不会真正想要这样的野兽
答案 7 :(得分:0)
考虑indexed-tree-map,您将能够按索引访问元素并获取元素索引,同时保持排序顺序。可以将重复项作为相同键下的值放入数组中。