【问题标题】:Order of HashSetHashSet 的顺序
【发布时间】: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

标签: java hashset


【解决方案1】:

您可能想查看documentation

它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变

【讨论】:

  • OP 引用了那句话。 :)
  • 感谢您的快速回复。因此,鉴于hashCode() 的实现是正确的(即不随时间变化),结果会是一致的吗?我阅读了文档,但发现它有点令人困惑,尤其是“它不能保证订单会随着时间的推移保持不变”。这意味着如果我从HashSet 检索输出,比如说 10 分钟后,我会得到不同的结果?
  • 刚看到,但如果您已经知道文档中的说法相反,那么询问订单是否得到保证对我来说毫无意义
  • 这一切都取决于它是如何实现的,但是文档明确表示不能保证顺序,所以我不会冒险认为它是不可变/恒定的
  • 它有可能这样做,但我不会将其视为预期和可行的行为。
猜你喜欢
  • 2011-02-11
  • 2014-08-28
  • 2015-06-22
  • 2020-12-11
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2018-05-15
相关资源
最近更新 更多