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

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


iPotato94
浏览 5801回答 3
3回答

Its_forever

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

Its_forever

关于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集合的无序性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java