问答详情
源自:5-2 学生选课---使用 Map 添加学生

Map中元素不是无序的吗?为什么我输出是添加的顺序是一样的?

public void testPut(){
        int i=0;
        Scanner reader = new Scanner(System.in);
        while(i<3){
            System.out.print("请输入学生ID:");
            String stuId = reader.next();
            Student st = students.get(stuId);
            if(st==null){
                System.out.print("请输入学生姓名:");
                String stuName=reader.next();
                students.put(stuId, new Student(stuId,stuName));
                System.out.println("成功添加学生:"+students.get(stuId).name);
                i++;
            }else
                System.out.println("学生ID已被占用!");
        }
    }
public void testKeySet(){
        Set<String> stuIDs = students.keySet();
        System.out.println("共有"+students.size()+"个学生");
        for (String string : stuIDs) {
            Student st = students.get(string);
            System.out.println(st.id+":"+st.name);
        }
    }


提问者:阿莫林西 2017-03-03 11:51

个回答

  • qq_这是只仓鼠_0
    2017-03-07 19:36:23
    已采纳

    研究了一段时间后发现所谓无序,并非是输出的结果每次会不一样,而是放进去之后没有顺序,

    Map<String, Integer> m = new HashMap<>();

    for(int i=0; i<10; i++) {   

     m.put("key"+i, i); 

    } 

    System.out.println(m);

    这段代码就能看出来,放进去的时候是1-10,输出的却不是,但是输出的结果却是固定的,也就是说没有顺序但是执行结果缺一致,深入源码发现其通过放入的对象hashcode计算出其索引,然后放入,也就是说在这个时候顺序就固定了,另外从他的遍历方式能够看出来是链表方式,使用next节点连接下一个数值,所以虽说他是无序的,但执行结果缺是唯一的

  • CatzzZ
    2017-03-05 23:58:43

    你可以看看源码,计算机怎么去存一个无序的东西或者怎么去存一个有序的东西,答案是把数按添加顺序存进去,有序的的东西会有明确的地址引用,也就是相对于数组的角标。而无序只是把角标隐去了而已,再不打乱内部顺序的情况,是不会破坏内部的顺序。

  • 吾心常在0
    2017-03-03 14:30:33

    你多试几次  看看