Java-设置未按顺序打印
我刚开始学习集合,有人提到它不关心顺序,不像列表 但是,当我键入这段代码时:Java-设置未按顺序打印,java,Java,我刚开始学习集合,有人提到它不关心顺序,不像列表 但是,当我键入这段代码时: public class test { public static void main(String[] args) { Set<Integer> nums = new HashSet<Integer>(); nums.add(0); nums.add(1); nums.add(2); nums.add(3)
public class test {
public static void main(String[] args) {
Set<Integer> nums = new HashSet<Integer>();
nums.add(0);
nums.add(1);
nums.add(2);
nums.add(3);
for (Integer num : nums)
System.out.println(num);
}
}
我尝试过扰乱数字的添加顺序,如下所示:
public class test {
public static void main(String[] args) {
Set<Integer> nums = new HashSet<Integer>();
nums.add(1);
nums.add(0);
nums.add(3);
nums.add(2);
for (Integer num : nums)
System.out.println(num);
}
}
公共类测试{
公共静态void main(字符串[]args){
Set nums=new HashSet();
增加(1)项;
nums.add(0);
增加(3);
增加(2);
for(整数num:nums)
系统输出打印项数(num);
}
}
奇怪的是,输出仍然是有序的
在我打印出它的元素之前,有什么东西可以对集合进行排序吗?
或者
HashSet
不是用来创建无序集的吗?这只是一个巧合(或者实际上是因为HashSet
内部如何工作,但现在不关心这一点)。尝试添加一些值,然后删除,然后添加等等,您将看到它无法正确打印<代码>哈希集是无序的。除非另有说明,否则集合通常是无序的。AHashSet
确实是未排序的集合。这意味着您不能假设它迭代(和打印)的顺序的任何内容,正如您不能假设它将被排序一样,您也不能假设它不会被排序。订单完全由内部实现决定。HashSet
不提供任何订单保证。对于某些数据集来说,这并不意味着顺序不能作为其实现方式的副产品出现。只是你不能依赖它,它可能会随着实现的不同而变化,等等。HashSet在设计上是无序的。您将只放入有限的小数字,这些小数字会以相同的顺序生成值的哈希代码。这就是它按顺序打印的原因。请参阅下面的代码以查看哈希代码并对其进行分析
for (Integer num : nums){
System.out.println(num + " - hashcode = " +num.hashCode());
}
再加上几个大数字,看看无序的自然在起作用
例如:
nums.add(29000);
nums.add(199201);
对某一事物没有担保与对该事物有相反担保是不同的。
nums.add(29000);
nums.add(199201);