这是我在一次练习中的代码,
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,但是,我想知道为什么?
答案 0 :(得分:4)
HashSet
不会保留订单,如果您希望它保留插入顺序LinkedHashSet
而不是
如果您希望它保留一些comparative order then use custom Comparator
和TreeSet
答案 1 :(得分:2)
HashSet
不是OrderedSet
,例如TreeSet
,因此您无法对订单做出任何假设。
答案 2 :(得分:0)
HashSet不承认广告订单。如果您对插入订单感到担心,可以使用TreeSet或LinkHashSet。
答案 3 :(得分:0)
正如其他答案所指出的,这是因为您使用Set
来存储对象(特别是HashSet
)。 Sets
不保证订购添加到其中的商品,这就是为什么您会看到它们以与添加商品的方式不同的顺序打印出来的原因。如果您想维护添加到Collection的元素的顺序,那么您可能需要使用LinkedList
或ArrayList
等列表。
我会指出你在语言中不同收藏类型的Java trail方向,而不仅仅是让你离开。跟踪将帮助您理解的是何时使用Java提供的不同类型的Collection实现以及每种集合类型的特征。
答案 4 :(得分:0)
对于HashSet,迭代顺序基于每个元素的hashCode,它或多或少是“随机的”(虽然是某些类实例的决定因素)。
要使迭代顺序与插入顺序匹配,请使用其迭代顺序与插入顺序相同的LinkedHashSet
,或使用SortedSet
的实现,例如TreeSet
,对其元素进行排序根据他们的自然顺序(如果他们使用可比较的)或使用提供的比较器。