輸入順序打亂,keySet出來的是有序的
輸入1,3,2出來的怎么是1,2,3
package?com.com.test.collection; import?java.sql.Struct; import?java.util.HashMap; import?java.util.Map; import?java.util.Scanner; import?java.util.Set; public?class?MapTest?{ ????/** ?????*?用來承裝學(xué)生類型對象 ?????*/ ????public?Map<String,Student>?students; ????/** ?????*?在構(gòu)造方法中初始化students ?????*/ ????public?MapTest(){ ????????this.students?=?new?HashMap<String,Student>(); ????} ????/** ?????*?測試添加:輸入學(xué)生ID,判斷是否被占用 ?????*?未占用,則輸入學(xué)生姓名,創(chuàng)建新學(xué)生對象,并且 ?????*?添加到students中 ?????*/ ????public?void?testAdd(){ ????????Scanner?sca?=?new?Scanner(System.in); ????????int?i=?0; ????????while(i<3){ ????????????System.out.println("請輸入學(xué)生ID"); ????????????String?ID?=?sca.next(); ????????????//判斷ID是否被占用 ????????????Student?st?=?students.get(ID); ????????????if(st?==?null){ ????????????????//提示輸入姓名 ????????????????System.out.println("請輸入姓名"); ????????????????String?name?=?sca.next(); ????????????????//創(chuàng)建新的學(xué)生對象 ????????????????Student?newStudent?=?new?Student(ID,name); ????????????????//通過調(diào)用students的put方法,添加ID-學(xué)生映射 ????????????????students.put(ID,newStudent); ????????????????System.out.println("添加成功:"+students.get(ID).id+students.get(ID).name); ????????????????i++; ????????????}else{ ????????????????System.out.println("該學(xué)生ID已被占用!"); ????????????????continue; ????????????} ????????} ????} ????/** ?????*?測試Map的keySet方法遍歷返回學(xué)生列表 ?????*/ ????public?void?testKeySet(){ ????????//通過keySet方法,返回Map中的所有鍵的集合 ????????Set<String>?keySet?=?students.keySet(); ????????//取得students的容量 ????????System.out.println("總共有"+students.size()+"個(gè)學(xué)生"); ????????//遍歷keySet,取得每一個(gè)鍵,在調(diào)用get方法取得每個(gè)鍵的value ????????for?(String?stuId:keySet){ ????????????Student?st?=?students.get(stuId); ????????????if(st?!=?null){ ????????????????System.out.println("學(xué)生:"+st.id+st.name); ????????????} ????????} ????} ????/** ?????*?測試刪除,remove ?????*?@param?args ?????*/ ????public?void?testRemove(){ ????????System.out.println("請輸入要刪除的學(xué)生ID!"); ????????//輸入待刪除的學(xué)生ID ????????Scanner?console?=?new?Scanner(System.in); ????????while(true){ ????????????String?ID?=?console.next(); ????????????Student?st?=?students.get(ID); ????????????if(st?==null){ ????????????????//提示ID不存在 ????????????????System.out.println("該ID不存在!"); ????????????????continue; ????????????} ????????????students.remove(ID); ????????????System.out.println("成功刪除學(xué)生:"+st.name); ????????????break; ????????} ????} ????/** ?????*?測試修改 ?????*/ ????public?void?testModify(){ ????????System.out.println("請輸入要修改的學(xué)生的ID!"); ????????Scanner?console?=?new?Scanner(System.in); ????????while(true){ ????????????String?stuID?=?console.next(); ????????????Student?st?=?students.get(stuID); ????????????if(st?==?null){ ????????????????System.out.println("該ID不存在!"); ????????????????continue; ????????????} ????????????System.out.println("當(dāng)前該學(xué)生ID,所對應(yīng)的學(xué)生為:"+st.name); ????????????System.out.println("請輸入新的學(xué)生姓名:"); ????????????String?name?=?console.next(); ????????????Student?newStudent?=?new?Student(stuID,name); ????????????students.put(stuID,newStudent); ????????????System.out.println("修改成功!"); ????????????break; ????????} ????} ????/** ?????*?通過entrySet方法來遍歷Map ?????*?@param?args ?????*/ ????public?void?testEntrySet(){ ????????Set<Map.Entry<String,Student>>?entrySet?=?students.entrySet(); ????????for?(Map.Entry<String,Student>?entry:entrySet){ ????????????System.out.println("取得鍵:"+entry.getKey()); ????????????System.out.println("對應(yīng)的值為:"+entry.getValue().name); ????????} ????} ????public?static?void?main(String[]?args)?{ ????????MapTest?mt?=?new?MapTest(); ????????mt.testAdd(); ????????mt.testKeySet(); //????????mt.testRemove(); ????????mt.testEntrySet(); ????????mt.testModify(); ????????mt.testEntrySet(); ????} }
2018-12-14
首先你要知道Java中無序(unordered),有序(ordered)是什么意思,它們跟我們我們所理解的可能不太一樣.
? 在Java中無序指的是Java語言沒有規(guī)定某個(gè)容器按什么順序遍歷,在不同的Java虛擬機(jī)上對某個(gè)容器的實(shí)現(xiàn)是不一樣,比如說運(yùn)行在Windows和Linux上的Java虛擬機(jī)對HashSet的遍歷順序可能不太一樣,但對同一種虛擬機(jī)來說遍歷輸出都是一樣的。而不是我們?nèi)粘K斫獾?無序就是亂序"的意思。
? 有序也是一樣的道理,Java規(guī)定了容器的遍歷順序,在不同的Java虛擬機(jī)上要保證遍歷的順序跟加入元素的順序一致。
? 通俗地來講,在Java中無序就是不同的Java虛擬機(jī)對某個(gè)容器有不同的遍歷方法,但對每一個(gè)具體的虛擬機(jī)它們的遍歷方法是固定的.比如你遇到的情況在Windows上運(yùn)行的Java虛擬機(jī)對HashSet的遍歷只有一種輸出方式,但你換一個(gè)Java虛擬機(jī)跑一跑你這個(gè)程序可能輸出就不一樣了。
2018-12-13
我的也是有序輸出,搞不懂為什么。。。
2018-07-17
設(shè)置輸入五六個(gè),測試多幾次就好了。
2018-07-05
同我也是這樣的,不管怎么輸入結(jié)果都是有序的,不知道為什么我Set集輸出的結(jié)果也是一直都是有序的
2018-06-05
鏈表和哈希表的區(qū)別。
如果你學(xué)過數(shù)據(jù)結(jié)構(gòu),你就知道鏈表的特性,list是一種鏈表
set是哈希表,通過哈希值來存取,所以理論上的存取時(shí)間復(fù)雜度是O(1)
你每次運(yùn)行結(jié)果是不一樣的