【问题标题】:How come the output for the set is the same as the List. I thought it would be different since sets are unordered为什么集合的输出与列表相同。我认为这会有所不同,因为集合是无序的
【发布时间】:2019-05-10 10:47:11
【问题描述】:
List<String> myList = new ArrayList<String>();
myList.add("A");
myList.add("B");
myList.add("C");
myList.add("D");

//Output is [A, B, C, D]



    Set<String> mySet = new HashSet<String>();
mySet.add("A");
mySet.add("AB");
mySet.add("AC");
mySet.add("AD");
mySet.add("AE");

//输出为AB、AC、A、AE、AD

//然后我把这个集合复制到另一个ArrayList中得到这个。

 List<String> myList2 = new ArrayList<String>(mySet);
 System.out.println(myList2);

//输出为[ AB, AC, A, AE, AD]

为什么顺序是一样的?我知道无法预测 myList2 的顺序,因为它是从集合中复制的,我想知道为什么输出与集合相同。

【问题讨论】:

  • Set 是无序的这一事实并不意味着它会在您每次迭代时以不同的随机顺序迭代其元素。它以特定顺序返回元素(在本例中为 AB、AC、A、AE、AD),但您无法预测顺序是什么。
  • 这可能是因为您添加的五个字符串恰好按迭代器使用的某种顺序存储。但是,这种行为并不能保证,并且在 JVM 上可能会有所不同,并且可能会随着您添加/删除元素而改变。阅读Iteration order of HashSet了解更多信息。

标签: java set


【解决方案1】:

因为 Set 是无序的,而 List 本质上是有序的,所以第一个列表会按照你插入的顺序返回内容。但是您创建的第二个列表按 Set 随机提供的顺序插入了项目。

希望对你有帮助

【讨论】:

    【解决方案2】:

    Set 是无序的并不意味着如果没有发生结构修改它会不时改变顺序。如果您在 Set 中插入某个元素,然后在该元素上循环 n 次,那么您将获得相同的 loop-1 到 loop-n 的顺序。

    Set<String> mySet = new HashSet<String>();
    mySet.add("A");
    mySet.add("AB");
    mySet.add("AC");
    mySet.add("AD");
    mySet.add("AE");
    //print it 5 times it will print in the same order for all 5
    System.out.println(mySet); // print line-1
    System.out.println(mySet); // print line-2
    System.out.println(mySet); // print line-3
    System.out.println(mySet); // print line-4
    System.out.println(mySet);// print line-5
    

    因此,您不应期望第 1 行的订单和第 5 行的订单会有所不同。

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 2020-05-22
      • 2019-02-11
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多