添加Set之前代码运行正常,结果也正常。添加set之后,没有报错,但我选择课程2、1、4,输出的还是2、1、4,顺序没有变啊 不知道为什么
找到原因了,
DK8版java.util.HashMap内的hash算法比JDK7版的混淆程度低;在[0, 2^32-1]范围内经过HashMap.hash()之后还是得到自己。题主的例子正好落入这个范围内。外加load factor正好在此例中让这个HashMap没有hash冲突,这就导致例中元素正好按大小顺序插入在HashMap的开放式哈希表里。
作者:RednaxelaFX
链接:https://www.zhihu.com/question/28414001/answer/40733996
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
for(int i=0;i<6;i++){ System.out.print("请输入要的课程编号:"); String courseID=sc.next(); for (Course temp : st.courseTo) { if(temp.id.equals(courseID)){ st1.course.add(temp); } } }
你将输入课程ID部分代码中的循环次数增加一点,不要只限定输入三次,就看出效果了
我百度了下,貌似JDK8(不知道从JDK几开始,我是JDK8)的HashSet、HashMap实现变了。元素插入的的时候,hash表是用算法把不同的数据按照规则放在响应的地址里,所以根据hash表的遍历去找的话,无论怎么放,位置是一定的,并且遍历的方式也是一定的。
题主可以换成老版本的JDK试试,再看看效果
我的也是这个情况,没有无序的效果,怀疑是Java8改进的地方吧