【问题标题】:java.util.HashSet int iteration order [duplicate]java.util.HashSet int 迭代顺序 [重复]
【发布时间】:2013-06-24 22:37:33
【问题描述】:

当我运行如下所示的代码时,输​​出为 [50, 20, 5, 40, 10, 30]。 我不明白这个命令。为什么输出不是 [10, 5, 20, 30, 40, 50] ?

List list = Arrays.asList(10, 5, 10, 20, 30, 40, 50);
System.out.println(new HashSet(list));

【问题讨论】:

  • HashSet 不保留插入顺序!
  • 因为 HashSets 的迭代顺序是不确定的。请参阅 Javadoc,您应该在发布之前查阅该文档。 -1
  • EJP 您在 Baadshah 的回答下阅读了我的评论。名誉不是目的,我的目的是分享。阅读 raptortech97 的回答。

标签: java


【解决方案1】:

Docs says

这个类实现了 Set 接口,由一个哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。此类允许 null 元素。

LinkedHashSet

【讨论】:

  • 我不想排序。我阅读了文档,但是当我尝试了另外两台计算机时,我得到了相同的输出。如果订单不保证,怎么一样?
  • 随着时间的推移添加和删除元素,迭代顺序可能会发生变化。你永远不应该依赖 Hashset 的迭代顺序,因为它“不保证迭代顺序”,尽管在实践中,如果你使用默认构造函数创建一个新的 Hashset 并添加相同的元素,你最终会得到相同的迭代订购。
  • raptortech 您给出了我想知道并想听的答案。谢谢。
【解决方案2】:

HashSet 不维护插入顺序。你需要的是LinkedHashSet

【讨论】:

    【解决方案3】:

    HashSet 类不保证您输入数据的顺序。

    如果您List 放在HashSet 中,而是继续使用List,您将获得在其中添加值的顺序。

    您可以使用LinkedHashSet 来保持广告顺序。

    如果你想排序List,那么你可以使用Collections.sort()。 (额外信息,不需要的请忽略)

    【讨论】:

      【解决方案4】:

      来自doc

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

      【讨论】:

      • TreeSet 没有帮助,因为 OP 需要插入顺序。
      • 哎呀..感谢您的更正..@RaviThapliyal
      • LinkedHashSet 可以用..
      猜你喜欢
      • 2019-01-15
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      相关资源
      最近更新 更多