测试一下HashSet类中对象无序无重复的有关问题,当小弟我打印输出的时候发现输出居然有序,请教,哪里出了有关问题

测试一下HashSet类中对象无序无重复的问题,当我打印输出的时候发现输出居然有序,请问,哪里出了问题?
JDK是JDK8,代码如下:

import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;

class TestHashSet {
    private static final int num = 3000;

    public static void main(String[] args) {
        int a;
        int i;

        Set<Integer> s = new HashSet<Integer>();
        for (i = 0; i < num; i++) {
            a = (int)(Math.random() * 10);
            s.add(a);
        }

        i = 0;
        for (Iterator it = s.iterator(); it.hasNext(); i++) {
            a = (Integer)it.next();

            System.out.print(a + " ");

            if (i % 20 == 0 && i != 0) {
                System.out.println();
            }
        }
        System.out.println();
        System.out.println(i);
    };
};

输出是这样的:
0 1 2 3 4 5 6 7 8 9
10
------解决思路----------------------
你好。 在你的代码中 由于Math库中的Random是产生0 ~ 9(不包括10)的整数。
由于set里面不包含重复元素, 所以3000次应该会产生很多重复数据。 当你把num=3000改成num  = 30
多试验几遍, 就会发现会出现这种情况[0, 1, 2, 5, 6, 7, 8, 9]。 你的程序本身没有问题 就是因为3000太大了
0 ~ 9 产生重复的概率很大
------解决思路----------------------
HashSet能够确保不重复,并不确保顺序

试着Debug了一下,生成随机数的时候,确实是无序的,但是add进HashSet时,还是被自动调整顺序了
感觉拿纯数字测试没有意义,用字符串测试一下“1”,”10”,”2”,”11”有可能会有不同的效果

参考:http://www.iteye.com/problems/25434
------解决思路----------------------
引用:
你好。 在你的代码中 由于Math库中的Random是产生0 ~ 9(不包括10)的整数。
由于set里面不包含重复元素, 所以3000次应该会产生很多重复数据。 当你把num=3000改成num  = 30
多试验几遍, 就会发现会出现这种情况[0, 1, 2, 5, 6, 7, 8, 9]。 你的程序本身没有问题 就是因为3000太大了
0 ~ 9 产生重复的概率很大
  
@Yang_outlook正解,接着他的,你是将元素放入到HashSet中,对于 HashSet 而言,它的底层采用 HashMap 来保存所有元素,向HashSet中加入元素,除了要判断equals() 方法,还要求两个对象的hashCode()值,你的代码产生的整数0-9相应的hashCode也为0-9,那么相应的存储也是按照这个hashCode值存储的,要是输出乱序的整数序列,可以重载hashCode()方法。测试一下HashSet类中对象无序无重复的有关问题,当小弟我打印输出的时候发现输出居然有序,请教,哪里出了有关问题
------解决思路----------------------
七楼正解。

1. 之所以0-9所有的10个数字全部出现,就是因为重复次数太多,每个数字都出现的可能性非常大。就像5楼说的那样你可以减少循环次数,比如30次。

2. 之所以0-9十个数字按顺序排列,是因为Integer类复写了hashCode方法,它返回的哈希值就是,Integer对象包装的int值(可以查阅API文档)。而hashSet类底层使用的是哈希表结构,而哈希表中的元素排列顺序就是按照哈希值排序的。