【发布时间】:2017-08-25 02:57:11
【问题描述】:
(这个问题不是关于使用LinkedHashSet 而不是HashSet)
我知道HashSet 不保留任何添加顺序:
它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变
假设有一个程序以相同的顺序将完全相同的元素添加到HashSet 并输出这些元素。
HashSet<Integer> set = new HashSet<Integer>();
Random random = new Random(1000);
for (int i = 0; i < 1000; i++)
set.add(random.nextInt());
set.forEach(s -> System.out.println(s));
如果我多次重新运行同一个程序,输出是否保证相同?
【问题讨论】:
-
在实践中,是的。但我不认为这是保证,因此您应该澄清保证的确切含义。这些对象还需要在每次运行时具有相同的哈希码,大多数情况下都是如此。也就是说,他们不能使用在 jvm 时间随机挑选的种子。 (这是可能的,但在 Java 中并不常见。我想我从未见过。)
-
保证?不,但它们可能是一致的,具体取决于
hashCode()实现。相比之下,我听说 Java 9 的Map工厂实现将使用随机种子来阻止开发人员依赖迭代顺序。 -
你不明白“它不能保证”的哪一部分?
-
@yshavit 有趣的想法,但这似乎不是动机:stackoverflow.com/q/45222328/1553851
-