【发布时间】:2017-06-16 18:07:13
【问题描述】:
如果我从同一个集合中创建 2 个列表,我可以确定我在两个列表中得到相同的排序吗? (我不关心顺序,只要两个列表具有相同的顺序,并且我不在创建两个列表之间的集合上执行任何操作。)
List l = new ArrayList(set);
List l1 = new ArrayList(set);
我了解创建这些列表并获得相同顺序的方法是有保证的,并且我没有充分的理由以这种方式创建两个列表,但我想知道为什么在一个如果不对其执行修改操作,set 将会改变。
编辑:该集合是一个无序的 HashSet
【问题讨论】:
-
如果它是一个哈希集,如果它在中间发生突变,则否(不能保证排序,但如果不修改集合就不会改变)。如果是其他任何东西,则将定义排序,以便您可以根据它进行调整。
-
这完全取决于实现。我可以设想一个实现,其中迭代集合会以某种方式改变集合的顺序。非常不可能,但有可能,并且不能保证它不会发生。
-
没有。
Set对其迭代顺序不提供任何保证。甚至不是一致的。它可能会选择以您的访问权限为借口来整理内部结构,从而改变下一次迭代的顺序。 -
@Boris,这不是
Set本身的属性。例如TreeSet和LinkedHashSet等一些集合保证了迭代顺序。 -
@aetheria 绝对是:来自JavaDoc for
Set- “元素以无特定顺序返回”。 IE。Set特别声明它不提供任何保证。谈论具体的植入完全无关紧要——就像说Set可以存储在数据库中,因为PersistentSet恰好是。