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我真的认为“无顺序”是集合的事实要求之一。谢谢谢谢这里所有的答案都很好(全部都投了赞成票),但这一个给出了一个明确的解决方案。我将“强制解决问题”