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

老生常谈的Map输出还是有序问题???

为什么我一样输入ID:1、2、......、9,都到9了,而且value值我还特意打乱了输入,结果运行出来的顺序还是有序的。。。而讲师只输入了3个key值就已经表现出了乱序。。。这究竟是怎么回事?

http://img1.sycdn.imooc.com//5a6ab3790001a4e903160578.jpg

public class MapTest {
	Scanner input=new Scanner(System.in);
	//创建Map对象,用来承装学生类型对象
	public Map<String,Student> students;
	
	//在构造器中初始化students属性
	public MapTest(){
		this.students=new HashMap<String,Student>();
	}

	//测试“添加”方法:接收输入学生ID,检测是否被占用;若未被占用,则提示输入姓名并创建新学生对象,添加到students中
	public void testPut() {
		int a=0;
		while(a<9) {
			System.out.println("请输入学生ID:");
			String id=input.next();
			//判断ID是否被占用
			Student st=students.get(id);          //此处若students中不存在此ID,则返回null值。
			if(st==null) {
				System.out.println("请输入学生姓名:");
				String name=input.next();
				//创建新的学生对象
				Student newStudent=new Student(id,name);
				//通过调用students的put()方法,添加“ID-学生”映射
				students.put(id, newStudent);
				//if条件为“st==null",所以此处不能替换为“st.name",因为st中可能包含空指针。
				System.out.println("成功添加学生:"+newStudent.name);
				a++;
			}else {
				System.out.println("您输入的ID已被占用!");
			}
		}
	}
	
	//测试Map(students)的keySet()方法
	public void keySet() {
		//通过keySet方法,返回students中所有“键”的集合
		Set<String> key=students.keySet();
		System.out.println("总共有"+students.size()+"个学生");
		
		for(String stuId:key) {
			Student st=students.get(stuId);
			if(st!=null) {
				System.out.println("学生:"+st.name);
			}
		}
	}
	
	//测试删除Map中的映射
	public void testRemove() {
		//判断是否有对应的学生对象		
		while(true) {
			System.out.println("请输入要删除的学生的ID:");
			String rmId=input.next();
			Student st=students.get(rmId);
			if(st==null) {
				System.out.println("输入的ID不存在!");
				continue;
			}
			students.remove(rmId);
			System.out.println("学生:"+st.name+"已删除!");
			break;
		}
	}
	
	//通过entrySet方法来遍历Map
	public void testEntrySet() {
		//通过entrySet方法返回Map中的所有键值对
		Set<Entry<String,Student>> entrySet=students.entrySet();
		for(Entry<String,Student> entry:entrySet) {
			System.out.println("取得键:"+entry.getKey());
			System.out.println("对应的值为:"+entry.getValue().name);
		}
	}
	
	//利用put()方法修改Map中已有的映射
	public void testModify() {
		System.out.println("请输入要修改的学生ID:");
		while(true) {
			String id=input.next();
			//从students中查找该学生ID对应的学生对象
			Student st=students.get(id);
			if(st==null) {
				System.out.println("该ID不存在,请重新输入!");
			}else {
				System.out.println("当前ID所对应的学生为:"+st.name);
				System.out.println("请输入新的学生姓名:");
				String newName=input.next();
				Student newSt=new Student(id,newName);
				students.put(id, newSt);
				System.out.println("修改成功!");
				break;
			}
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MapTest mt=new MapTest();
		mt.testPut();
		mt.keySet();
//		mt.testRemove();
		mt.testModify();
		mt.testEntrySet();
	}
}

正在回答

5 回答

好像会根据键值进行排序

2 回复 有任何疑惑可以回复我~
#1

qq_宫湦_03802224 提问者

唉,不清楚
2018-01-30 回复 有任何疑惑可以回复我~

我引用下别人的话:在Java中无序指的是Java语言没有规定某个容器按什么顺序遍历,在不同的Java虚拟机上对某个容器的实现是不一样,比如说运行在Windows和Linux上的Java虚拟机对HashSet的遍历顺序可能不太一样,但对同一种虚拟机来说遍历输出都是一样的。而不是我们日常所理解的"无序就是乱序"的意思。


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

同样是有序的,无论如何打乱,都会按照输入的顺序输出,,,

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

map是数组和链表的形式,数组是有序的(便于查询,速度快),链表是无序的(利于插入和删除)

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

用了你的代码,也是有序,会不会是java更新后有这个特性,不影响

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

举报

0/150
提交
取消
Java入门第三季
  • 参与学习       409778    人
  • 解答问题       4546    个

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

进入课程

老生常谈的Map输出还是有序问题???

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号