套装的“toArray”是否具有确定性?

时间:2012-03-30 21:04:00

标签: java collections set

显然,套装没有任何排序,所以如果我做的话,我不能指望任何具体的排序

String[] string = mySet.toArray();

但是,我遇到了一个用例,我不关心字符串数组的排序,但我确实需要它是这样的情况:如果两个集合彼此相等,那么:

StringUtils.join(mySet.toArray(),',');

将始终为这些集合生成相同的字符串,无论我运行程序多少次,假设我坚持使用相同的代码。

我有这个保证吗?

同样,对于迭代器中给定Set的元素出现的顺序,这完全是真的吗?

6 个答案:

答案 0 :(得分:7)

一般情况下,您无法保证Set的顺序,所以即使它现在有效,也可能在将来不行。但是,您可以保证LinkedHashSet的顺序,以便您可以使用它。这仅在集合具有以相同顺序插入的元素时才有效。如果您没有这种情况,您可能只需要对该集进行排序并打印出来。

答案 1 :(得分:4)

不,绝对没有。对于一个简单的例子,请考虑:

 LinkedHashSet<String> set1 = new LinkedHashSet<String>();
 set1.add("x");
 set1.add("y");

 LinkedHashSet<String> set2 = new LinkedHashSet<String>();
 set2.add("y");
 set2.add("x");

这两个集合相等,但由于LinkedHashSet保留了插入顺序,因此保证它们的迭代器将以不同的顺序返回值 - 我希望toArray具有相同的效果。< / p>

答案 2 :(得分:4)

从技术上讲,没有你没有保证。 Set是一个界面。实施方式会有所不同,可能会也可能不会遵守此要求。

通过从Set中提取结果后自行排序数组来强制解决问题。

答案 3 :(得分:3)

这完全取决于Set实施。 Set是一个接口,而不是一个类,toArray()除了必须与实现的迭代器匹配外,不保证任何东西。

来自Set.toArray()的javadoc:

  

如果此set对其迭代器返回的元素的顺序有任何保证,则此方法必须以相同的顺序返回元素。

答案 4 :(得分:2)

您没有此保证。可能你总是会看到这项工作,因为我怀疑大多数Set.toArray()的实现会为相同的集合生成相同的顺序,但是不能依赖于此。

你也不能依赖迭代器的顺序。

集完全无序。由于实现行为,您可能会从它们中获得看起来像一致顺序的内容,但这绝不是可依赖的。

答案 5 :(得分:1)

对于HashSet,您可以按相同顺序添加元素,并根据容量和负载因子获得不同的订单。

以下是一个示例,您可以从同一个集合中获得许多不同的订单。

http://vanillajava.blogspot.co.uk/2011/09/order-of-elements-in-hash-collection.html