A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© \(^o^)/ 中级黑马   /  2014-4-26 15:27  /  1184 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 \(^o^)/ 于 2014-4-26 22:02 编辑

  1. <P>
  2. import java.util.*;
  3. class test
  4. {
  5. public static void main(String[] args)
  6. {
  7. Map<String,String> map=new HashMap<String,String>();

  8. map.put("1","zhangsan1");
  9. map.put("4","zhangsan4");
  10. map.put("2","zhangsan2");
  11. map.put("3","zhangsan3");

  12. Set<String> keySet=map.keySet();

  13. Iterator<String> it=keySet.iterator();

  14. while(it.hasNext())
  15. {
  16. String key=it.next();
  17. String value=map.get(key);
  18. System.out.println(key+",,,,"+value);
  19. }
  20. }</P>
  21. <P>}
  22. </P>
复制代码
上面运行结果为:3、、、zhangsan3
                            2、、、zhangsan2  
                            1、、、zhangsan1              
                            4、、、zhangsan4
当我把while循环体中的句子
String key=it.next();
String value=map.get(key);
System.out.println(key+",,,,"+value);
变成
System.out.println(it.next()+",,,,"+map.get(it.next()));
结果为:
          3、、、zhangsan2              
          1、、、zhangsan4

为什么?


评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

6 个回复

倒序浏览
跟自增运算有点像,你本来循环一次只执行一次it.next(),但是改了之后循环一次就执行两次了,结果四次的任务两次就执行完了。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
在迭代时循环中next调用一次,就需要hasNext判断一次。
而你这句:System.out.println(it.next()+",,,,"+map.get(it.next()));//it.next()  //map.get(it.next())   调用了两次
执行一句换一行 所以  
                            3、、、zhangsan3
                            2、、、zhangsan2  
                            1、、、zhangsan1              
                            4、、、zhangsan4
执行完3、、、遇到了next()就换了一行    然后执行第二行的zhangsan2又换了一行....
所以上结果是          3、、、zhangsan2              
                             1、、、zhangsan4

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
System.out.println(it.next()+",,,,"+map.get(it.next()));
没执行一次it.next(),就会得到一个key值,这个输出语句中有两个it.next(),所以它一次while循环就会得到两个key值,第一个key值当然是直接打印了就是3,第二个key值应该是2 ,但它在map.get()方法中当然直接回输出其key值所对应的value值了,就是zhangsan2   。之后输出的原理相同。。。

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
楼主这个地方错了
上面运行结果为:3、、、zhangsan3
                        2、、、zhangsan2  
                        4、、、zhangsan4              
                        1、、、zhangsan1
改变后
变成
System.out.println(it.next()+",,,,"+map.get(it.next());
输出的结果是: 2,,,,zhangsan3
                      1,,,,zhangsan4
首先HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value, next;
Entry类里面有一个next属性,作用是指向下一个Entry。 第一个键值3对zhangsan3进来,通过计算其key的hash得到的index=0,记做:Entry[0] = zhangsan3; 所以不难理解将key改成it.next后,得到index[1]记为Entry[1]=zhangsan3

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
明白了,谢谢大家。。。
回复 使用道具 举报
之前我对这个it.next()也是好奇试验了下~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马