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

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

輸入順序打亂,keySet出來的是有序的

輸入1,3,2出來的怎么是1,2,3

https://img1.sycdn.imooc.com//5b13e6010001c06b03720753.jpg

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?{
????/**
?????*?用來承裝學生類型對象
?????*/
????public?Map<String,Student>?students;

????/**
?????*?在構造方法中初始化students
?????*/
????public?MapTest(){
????????this.students?=?new?HashMap<String,Student>();
????}
????/**
?????*?測試添加:輸入學生ID,判斷是否被占用
?????*?未占用,則輸入學生姓名,創建新學生對象,并且
?????*?添加到students中
?????*/
????public?void?testAdd(){
????????Scanner?sca?=?new?Scanner(System.in);
????????int?i=?0;
????????while(i<3){
????????????System.out.println("請輸入學生ID");
????????????String?ID?=?sca.next();
????????????//判斷ID是否被占用
????????????Student?st?=?students.get(ID);
????????????if(st?==?null){
????????????????//提示輸入姓名
????????????????System.out.println("請輸入姓名");
????????????????String?name?=?sca.next();
????????????????//創建新的學生對象
????????????????Student?newStudent?=?new?Student(ID,name);
????????????????//通過調用students的put方法,添加ID-學生映射
????????????????students.put(ID,newStudent);
????????????????System.out.println("添加成功:"+students.get(ID).id+students.get(ID).name);
????????????????i++;
????????????}else{
????????????????System.out.println("該學生ID已被占用!");
????????????????continue;
????????????}
????????}
????}
????/**
?????*?測試Map的keySet方法遍歷返回學生列表
?????*/
????public?void?testKeySet(){
????????//通過keySet方法,返回Map中的所有鍵的集合
????????Set<String>?keySet?=?students.keySet();
????????//取得students的容量
????????System.out.println("總共有"+students.size()+"個學生");
????????//遍歷keySet,取得每一個鍵,在調用get方法取得每個鍵的value
????????for?(String?stuId:keySet){
????????????Student?st?=?students.get(stuId);
????????????if(st?!=?null){
????????????????System.out.println("學生:"+st.id+st.name);
????????????}
????????}
????}

????/**
?????*?測試刪除,remove
?????*?@param?args
?????*/
????public?void?testRemove(){
????????System.out.println("請輸入要刪除的學生ID!");
????????//輸入待刪除的學生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("成功刪除學生:"+st.name);
????????????break;
????????}
????}
????/**
?????*?測試修改
?????*/
????public?void?testModify(){
????????System.out.println("請輸入要修改的學生的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("當前該學生ID,所對應的學生為:"+st.name);
????????????System.out.println("請輸入新的學生姓名:");
????????????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("對應的值為:"+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();
????}
}


正在回答

5 回答

首先你要知道Java中無序(unordered),有序(ordered)是什么意思,它們跟我們我們所理解的可能不太一樣.

? 在Java中無序指的是Java語言沒有規定某個容器按什么順序遍歷,在不同的Java虛擬機上對某個容器的實現是不一樣,比如說運行在Windows和Linux上的Java虛擬機對HashSet的遍歷順序可能不太一樣,但對同一種虛擬機來說遍歷輸出都是一樣的。而不是我們日常所理解的"無序就是亂序"的意思。

? 有序也是一樣的道理,Java規定了容器的遍歷順序,在不同的Java虛擬機上要保證遍歷的順序跟加入元素的順序一致。

? 通俗地來講,在Java中無序就是不同的Java虛擬機對某個容器有不同的遍歷方法,但對每一個具體的虛擬機它們的遍歷方法是固定的.比如你遇到的情況在Windows上運行的Java虛擬機對HashSet的遍歷只有一種輸出方式,但你換一個Java虛擬機跑一跑你這個程序可能輸出就不一樣了。


2 回復 有任何疑惑可以回復我~

我的也是有序輸出,搞不懂為什么。。。

0 回復 有任何疑惑可以回復我~

設置輸入五六個,測試多幾次就好了。

0 回復 有任何疑惑可以回復我~

同我也是這樣的,不管怎么輸入結果都是有序的,不知道為什么我Set集輸出的結果也是一直都是有序的

0 回復 有任何疑惑可以回復我~

鏈表和哈希表的區別。
如果你學過數據結構,你就知道鏈表的特性,list是一種鏈表
set是哈希表,通過哈希值來存取,所以理論上的存取時間復雜度是O(1)

你每次運行結果是不一樣的

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

輸入順序打亂,keySet出來的是有序的

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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