没有用于arrayset的Java实现

时间:2012-08-13 12:12:27

标签: java set

为什么Java提供Set类型的几种不同实现,包括HashSetTreeSet以及 {{1 }}?

8 个答案:

答案 0 :(得分:17)

仅基于无特定顺序的元素数组的集合将始终具有O(n)时间用于包含检查。它不会非常有用,IMO。您何时而不是HashSetTreeSet使用?

数组最有用的方面是您可以非常快速地访问具有特定索引的元素。当谈到集合时,这并不是非常相关。

答案 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,您将能够按索引访问元素并获取元素索引,同时保持排序顺序。可以将重复项作为相同键下的值放入数组中。