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

为什么用keySet遍历map,得到了有序结果?

为什么用keySet遍历map,得到了有序结果?

iPotato94 2016-01-17 00:01:01
package com.imooc.test; import java.util.HashMap; import java.util.Map; import java.util.Set; public class TestMap { public Map<Integer, String> map; public TestMap() { // TODO Auto-generated constructor stub map = new HashMap<Integer, String>(); } public void testPut(){ map.put(3, "爸爸"); map.put(1, "孙子"); map.put(4, "爷爷"); map.put(2, "儿子"); } public void testKeySet(){ Set<Integer> keySet = map.keySet(); for(Integer key : keySet){ String st = map.get(key); if (st != null) System.out.println(st); } } public static void main(String[] args) { // TODO Auto-generated method stub TestMap tm = new TestMap(); tm.testPut(); tm.testKeySet(); } }陈码农 【Java入门第三季】- 【第5章】 - 【5-2学生选课---使用Map添加学生】package com.imooc.collection_map; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; 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 testPut() { // 创建一个Scanner对象, 用来获取输入的学生ID和姓名 Scanner scan = new Scanner(System.in); int i = 0; while (i < 3) { System.out.println("请输入学生ID: "); String ID = scan.next(); // 判断该ID是否被占用 Student st = students.get(ID); if (st == null) { // 提示输入学生姓名 System.out.println("请输入学生姓名: "); String name = scan.next(); // 创建新的学生对象 Student newStudent = new Student(ID, name); // 通过调用students的put方法, 添加 ID-学生 映射 students.put(ID, newStudent); System.out.println("成功添加学生:" + students.get(ID).name); i++; } else { System.out.println("该学生ID已被占用!"); continue; } } } /**  * 通过keySet方法遍历Map  */ public void testKeySet() { // 通过keySet方法, 返回Map中所有"键"的Set集合 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.name); } } /**  *   * @param args  */ public static void main(String[] args) { // TODO Auto-generated method stub MapTest mt = new MapTest(); // 调用testPut() mt.testPut(); mt.testKeySet(); }package com.imooc.collection_map; import java.util.HashSet; import java.util.Set; /**  * 学生类  *   * @author KEN  *  */ public class Student implements Comparable<Student>{ public String id; public String name; public Set<Course> courses; // List, Queue, Set 是 Collection的子接口 //Student构造方法 public Student(String id, String name) { this.id = id; this.name = name; this.courses = new HashSet<Course>(); } }
查看完整描述

3 回答

已采纳
?
Its_forever

TA贡献361条经验 获得超328个赞

刚刚格式乱了:

你是想说:老师的输入顺序是1,2,3为什么打印出来的却是3,2,1吧? 
还是我之前说的,Set集合的无序性体现在输入顺序和输出顺序不一样。 
比如:我这样输入 
学号为:1  再输入姓名:Tom       //一
学号为:3  再输入姓名:xiaoming  //二
学号为:2  再输入姓名:Jack      //三 
输出顺序还是(3,2,1)。 
不论你怎么改变一,二,三的顺序,输出顺序始终是(3,2,1)。 
这就是我说的,Set的无序性体现在输入顺序和输出顺序不一致。


查看完整回答
2 反对 回复 2016-01-17
  • iPotato94
    iPotato94
    恩恩,这个无序性我明白了。 可是我这样输入 学号为:1 再输入姓名:Tom //一 学号为:3 再输入姓名:xiaoming //二 学号为:2 再输入姓名:Jack //三 输出顺序还是(1,2,3)。 不是你的(3,2,1)。 请问这个升序还是降序怎么控制?
  • iPotato94
    iPotato94
    不好意思,回复里不知道怎么改格式。
?
Its_forever

TA贡献361条经验 获得超328个赞

关于set无序集合,它的无序性体现在不按照添加的时候的顺序存储 。

比如你的添加顺序是这样的:

        map.put(3, "爸爸");
        map.put(1, "孙子");
        map.put(4, "爷爷");
        map.put(2, "儿子");

如果他是有序的话那么他的输出顺序是不是就该是:

爸爸,孙子,爷爷,儿子

但是它却输出了:

孙子,儿子,爸爸,爷爷

这就是Set集合无序性的体现,而不是输出顺序的无序性。

其实Set也是有序的,只是他的内部是按着hashCode来排序的。看起来无序而已。

你数字感觉的不明显,用字符串排序就明显一些了;

 public static void main(String[] args) {
        Collection people = new HashSet();
        people.add("孙子"); //1
        people.add("爷爷"); //2
        people.add("儿子");  //3
        people.add("爸爸" );  //4
        
        Iterator it = people.iterator();
        while(it.hasNext()){
         String test = (String)it.next();
         System.out.println(test);
    }
    }
    
   // 输出为:爸爸 儿子 爷爷 孙子

你不论怎么改变1,2,3,4的顺序,他的输出都是不会变的。

以上是我个人理解的Set集合的无序性。

查看完整回答
1 反对 回复 2016-01-17
  • iPotato94
    iPotato94
    那在视频【Java入门第三季】- 【第5章】 - 【5-2学生选课---使用Map添加学生】中,陈码农老师用了类似的方法,也用keySet输出(Value)学生姓名,但是顺序和(Key)学生ID的顺序不一致,为什么? (陈码农老师的代码我放在原问题中了)
  • Its_forever
    Its_forever
    老师的输入顺序是1,2,3为什么打印出来的却是3,2,1吧? 还是我之前说的,Set集合的无序性体现在输入顺序和输出顺序不一样。 比如:我这样输入 学号为:1 再输入姓名:Tom //一 学号为:3 再输入姓名:xiaoming //二 学号为:2 再输入姓名:Jack //三 输出顺序还是(3,2,1)。 不论你怎么改变一,二,三的顺序,输出顺序始终是(3,2,1)。 这就是我说的,Set的无序性体现在输入顺序和输出顺序不一致。
  • 3 回答
  • 0 关注
  • 5797 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信