【问题标题】:JAVA HashSet Order [duplicate]JAVA HashSet 顺序 [重复]
【发布时间】:2014-08-28 21:31:36
【问题描述】:

这是我在一个练习中的代码,

public class RockTest {
public static void main(String[] args){
    HashSet<Rock> hashset = new HashSet();
    Rock rock1 = new Rock("QingDanasty",89);
    Rock rock2 = new Rock("Modern",32);
    Rock rock3 = new Rock("MingDanasty",100);

    hashset.add(rock1);
    hashset.add(rock2);
    hashset.add(rock3);

    Iterator<Rock> iterator = hashset.iterator();
    while(iterator.hasNext()){
        System.out.println(iterator.next().getName());
    }
}
}

打印代码时,控制台显示的是 rock2 rock1 rock3 而不是 rock1 rock2 和 rock3 的顺序,但是不知道为什么?

【问题讨论】:

  • HashSet 顺序(如果你想这样称呼它的话..)是基于 hashCode 的。因此,根据放入它的对象的 HashCode 来决定排序。
  • 3 投票赞成重复问题,4 投票赞成回答已经回答的重复问题。有趣:)

标签: java sorting hashset


【解决方案1】:

HashSet 不保留顺序,如果您希望它保留插入顺序,请改用 LinkedHashSet

如果你想让它保留一些comparative order then use custom ComparatorTreeSet

【讨论】:

    【解决方案2】:

    HashSet 不是 OrderedSet,例如 TreeSet,因此您不能对订单做出任何假设。

    【讨论】:

      【解决方案3】:

      HashSet 未授予插入订单。如果您担心广告订单,可以使用TreeSetLinkHashSet

      【讨论】:

        【解决方案4】:

        正如其他答案所指出的,这是因为您正在使用 Set 来存储您的对象(在您的情况下尤其是 HashSet)。 Sets 不保证添加到其中的项目的顺序,这就是为什么您看到它们以与添加它们的方式不同的顺序打印出来的原因。如果您想保持添加到 Collection 的元素的顺序,那么您可能需要使用 LinkedListArrayList 等 List。

        我不会就此罢休,而是为您指明 Java trail 的方向,了解该语言中不同的 Collection 类型。该线索将帮助您了解何时使用 Java 提供的不同类型的 Collection 实现以及每种集合类型的特征。

        【讨论】:

          【解决方案5】:

          对于 HashSet,迭代顺序基于每个元素的 hashCode,它或多或少是“随机的”(尽管对于某些类的实例是决定性的)。

          要使迭代顺序与插入顺序相匹配,请使用迭代顺序与插入顺序相同的LinkedHashSet,或SortedSet 的实现,例如TreeSet,它根据元素的自然顺序对其元素进行排序(如果他们实现 Comparable) 或使用提供的 Comparator。

          【讨论】:

            猜你喜欢
            • 2015-06-22
            • 2021-07-16
            • 2018-05-15
            • 1970-01-01
            • 1970-01-01
            • 2015-03-31
            • 2015-02-05
            • 1970-01-01
            • 2015-03-29
            相关资源
            最近更新 更多