神奇的hashset addAll,哪位高手能解释一下

神奇的hashset addAll,谁能解释一下
  public static void main(String[] args)
    {
 
        Integer[] data = new Integer[50];//定义一个数组
        for (int i = 0; i < 50; i++) {
data[i]=(int) (Math.random()*20);
}
        for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+",");
}
        System.out.println();
        
        Set set = new HashSet();//new 一个hashset
        set.addAll(Arrays.asList(data));//将数组转为list并存入set中,就可以去掉重复项了
        for (Object object : set) {
System.out.print(object+",");
}
    }

打印结果:
7,11,9,19,4,1,8,17,4,14,17,15,4,14,7,16,17,5,6,14,9,15,17,14,19,6,19,7,7,2,8,11,19,12,14,10,15,6,17,3,7,10,11,2,4,14,2,17,8,13,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,


问题:set不是只有去重复功能吗,为什么还自动实现了排序了神奇的hashset addAll,哪位高手能解释一下
------解决思路----------------------
和哈希Code有关吧,换成字符串就不一样了:
    public static void main(String[] args) {

        String[] data = new String[50];// 定义一个数组
        for (int i = 0; i < 50; i++) {
            data[i] = String.valueOf((int) (Math.random() * 20));
        }
        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i] + ",");
        }
        System.out.println();

        Set<String> set = new HashSet<String>();// new 一个hashset
        set.addAll(Arrays.asList(data));// 将数组转为list并存入set中,就可以去掉重复项了
        for (Object object : set) {
            System.out.print(object + ",");
        }
    }

------解决思路----------------------
hashset 是按hash值存放数据的,你这只能说是一种巧合
------解决思路----------------------
hashset是根据哈希码存放的,你这纯粹是巧合,你看我运行的结果就不一样
9,12,17,18,0,4,9,4,1,5,15,3,8,17,11,15,15,10,6,7,15,12,14,0,16,19,12,5,10,0,14,12,10,1,19,2,10,15,6,7,9,11,17,3,8,17,17,11,11,0,
0,1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,16,19,18,
------解决思路----------------------
楼主的应该是java8吧,8的HashMap中的hash算法比6的要简单,直接导致这种分布较均匀的连续数会比较整齐
但千万不要将排序寄望于HashMap

------解决思路----------------------
引用:
Quote: 引用:

和哈希Code有关吧,换成字符串就不一样了:
    public static void main(String[] args) {

        String[] data = new String[50];// 定义一个数组
        for (int i = 0; i < 50; i++) {
            data[i] = String.valueOf((int) (Math.random() * 20));
        }
        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i] + ",");
        }
        System.out.println();

        Set<String> set = new HashSet<String>();// new 一个hashset
        set.addAll(Arrays.asList(data));// 将数组转为list并存入set中,就可以去掉重复项了
        for (Object object : set) {
            System.out.print(object + ",");
        }
    }

变成字符串是没这个问题了,如果说int类型算是个特例的话,那么是不是int类型从小到大排列,就不需要用sort排序了神奇的hashset addAll,哪位高手能解释一下

8L说得对。
这只是碰巧,万一以后HashSet的实现变了呢。。