黑马程序员技术交流社区

标题: map集合问题 [打印本页]

作者: \(^o^)/    时间: 2014-4-26 15:27
标题: map集合问题
本帖最后由 \(^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

为什么?



作者: 水竹    时间: 2014-4-26 16:05
跟自增运算有点像,你本来循环一次只执行一次it.next(),但是改了之后循环一次就执行两次了,结果四次的任务两次就执行完了。
作者: 程序爱好者    时间: 2014-4-26 16:06
在迭代时循环中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
作者: eternallove    时间: 2014-4-26 16:42
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   。之后输出的原理相同。。。
作者: 小马初长成    时间: 2014-4-26 20:30
楼主这个地方错了
上面运行结果为: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

作者: \(^o^)/    时间: 2014-4-26 22:02
明白了,谢谢大家。。。
作者: fendoubuxi    时间: 2014-4-30 00:34
之前我对这个it.next()也是好奇试验了下~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2