问题描述
Set<Integer> s = HashMap<Integer, String>.keySet()-------------->>>>>>>>>>>Iterator it = s.iterator();while(it.hasNext()) System.out.println(m.get(it.next()));不能保持插入HashMap的顺序输出----------->>>>>>>>>>>for(Integer i : s) System.out.println(m.get(i));可以保持插入顺序输出上面一段伪代码,一个是通过HashMap的keySet()方法得到一个键集合,再在键集合上迭代,输出HashMap的值,不能保持插入HashMap顺序输出另一个通过java 5.0的新特性 for(:)循环输出HashMap的值,就能保持插入序输出,为什么呢?谁能解释一下 for(:)运行机制,谢谢问题补充:我用的HashMap键是 Integer型 值是String型的,而且HashMap的中元素要多一些,我用的测试用例有22个键值对,前13行保持插入序,而13行以后就乱序了,还有增强的for(:)循环是将第二个操作数转化为数组实现,还是迭代器实现呢?问题补充:发现了,是我测试用例的问题,增强for循环的方法和迭代器的方法都会乱序输出,增强for也是用的迭代器实现,如果要保持插入顺序,应该用LinkedHashMap类,呵呵,谢谢大家
解决方案
jdk1.5的增强for循环, 如果是Collection, 调用的正是iterator()方法.在上面的例子中, 调用的都是 Set<String> soo 的 soo.iterator() 方法.所以, LZ的结论错了, aidiyuxin说对了: 两个方法是一样的结果.
解决方案二:
测试例子Map<String , String> moo = new HashMap<String , String>();moo.put("1","1");moo.put("2","2");moo.put("3","3");Set<String> soo = moo.keySet();Iterator<String> ioo = soo.iterator();while(ioo.hasNext()){System.out.println(moo.get(ioo.next()));}for(String str : soo){System.out.println(moo.get(str));}结果:321321没有什么特殊的地方啊
解决方案三:
如果用for(int i = 0 ; i < s i++)遍历呢?