为了账号安全,请及时绑定邮箱和手机立即绑定

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);
        }
    }


正在回答

4 回答

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

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节点连接下一个数值,所以虽说他是无序的,但执行结果缺是唯一的

0 回复 有任何疑惑可以回复我~
#1

阿莫林西 提问者

非常感谢!
2017-03-09 回复 有任何疑惑可以回复我~

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

1 回复 有任何疑惑可以回复我~

你多试几次  看看

0 回复 有任何疑惑可以回复我~
#1

阿莫林西 提问者

试了很多次都是一样的
2017-03-04 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信