Java 是一套';s";toArray“;确定性?

Java 是一套';s";toArray“;确定性?,java,collections,set,Java,Collections,Set,显然,集合没有任何类型的排序,所以如果我有,我不能期望有任何特定的排序 String[] string = mySet.toArray(); 然而,我面临一个用例,我不关心字符串数组的顺序,但我确实需要这样一种情况,即如果两个集合彼此相等,那么: StringUtils.join(mySet.toArray(),','); 将为这些集合生成完全相同的字符串,始终,无论我运行程序多少次,假设我使用相同的代码 我有这个保证吗 类似地,对于迭代器中给定集合的元素出现顺序,这一点是否完全正确?一般来

显然,集合没有任何类型的排序,所以如果我有,我不能期望有任何特定的排序

String[] string = mySet.toArray();
然而,我面临一个用例,我不关心字符串数组的顺序,但我确实需要这样一种情况,即如果两个集合彼此相等,那么:

StringUtils.join(mySet.toArray(),',');
将为这些集合生成完全相同的字符串,始终,无论我运行程序多少次,假设我使用相同的代码

我有这个保证吗


类似地,对于迭代器中给定集合的元素出现顺序,这一点是否完全正确?

一般来说,您无法保证您提到的
集合的顺序,因此即使它现在起作用,将来也可能不起作用。但是,您可以保证a的顺序,这样您就可以使用它了。但是,只有当集合中的元素插入顺序相同时,这种方法才有效。如果您没有这种情况,您可能只需要对集合进行排序并打印。

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

 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 set1=新建LinkedHashSet();
set1.添加(“x”);
set1.添加(“y”);
LinkedHashSet set2=新LinkedHashSet();
set2.添加(“y”);
set2.添加(“x”);

这两个集合是相等的,但是因为
LinkedHashSet
保留了插入顺序,所以可以保证它们的迭代器将以不同的顺序返回值-我希望
toArray
具有相同的效果。

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

也不能依赖迭代器的顺序


集合是完全无序的。由于实现行为的原因,您可能会从它们中获得看起来一致的顺序,但这在任何方面都不可靠。

从技术上讲,不,您没有保证<代码>设置
是一个接口。实施方式会有所不同,可能会也可能不会遵守此要求


从集合中提取结果后,通过自己对数组进行排序来强制解决问题。

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

从Set.toArray()的javadoc中:

如果这个集合保证迭代器返回元素的顺序,那么这个方法必须以相同的顺序返回元素


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

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


旁白:“Java”不是首字母缩略词。Set可以有顺序。例如TreeSet。@kukudas我真的认为“无顺序”是集合的事实要求之一。谢谢谢谢这里所有的答案都很好(全部都投了赞成票),但这一个给出了一个明确的解决方案。我将“强制解决问题”