亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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


正在回答

3 回答

研究了一段時間后發現所謂無序,并非是輸出的結果每次會不一樣,而是放進去之后沒有順序,

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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號