黑马程序员技术交流社区

标题: Map集合取出疑问 [打印本页]

作者: 杨卫腾    时间: 2012-9-22 12:23
标题: Map集合取出疑问
本帖最后由 杨卫腾 于 2012-9-22 14:29 编辑
  1. import java.util.Map;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Set;

  5. class MapTest
  6. {
  7.         public static void main(String[] args){               
  8.                 Map<Integer, String> map = new HashMap<Integer, String>();
  9.                 method_3(map);
  10.         }        

  11.         public static void method_3(Map<Integer, String> map) {
  12.                 map.put(13, "wangcai");
  13.                 map.put(12, "zhangsan");
  14.                 map.put(14, "wangwu");
  15.                 map.put(11, "zhaoliu");        
  16.                
  17.                 Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
  18.                 for(Iterator<Map.Entry<Integer, String>> it = entrySet.iterator(); it.hasNext(); ){
  19.                         System.out.println(it.next().getKey()+"="+it.next().getValue());
  20.                 }
  21.         }
  22. }
复制代码
输出的结果是:11=zhangsan
                     13=wangwu

结果怎么不是11=zhaoliu
                  12=zhangsan
                  13=wangcai
                  14=wangwu
我怎么想也想不通? 这是为什么呢

作者: 程金    时间: 2012-9-22 12:42
本帖最后由 程金 于 2012-9-22 12:48 编辑
  1. import java.util.Map;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Set;

  5. class MapTest
  6. {
  7.         public static void main(String[] args){               
  8.                 Map<Integer, String> map = new HashMap<Integer, String>();
  9.                 method_3(map);
  10.         }        

  11.         public static void method_3(Map<Integer, String> map) {
  12.                 map.put(13, "wangcai");
  13.                 map.put(12, "zhangsan");
  14.                 map.put(14, "wangwu");
  15.                 map.put(11, "zhaoliu");        
  16.                
  17.                 Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
  18.                 for(Iterator<Map.Entry<Integer, String>> it = entrySet.iterator(); it.hasNext(); ){
  19.                         System.out.println(it.next().getKey()+"="+it.next().getValue());
  20. _______________________________________________________________
  21.                              / /错误在这里,输出的时候你用了两次it.next(),每调用一次next(),iterator都会向下遍历一位,你的写法相当于先调用it.next(),得到一个元素,输出这个元素的key的值,再调用it.next(),取得下一个元素,并getValue()取得值

  22. 你的代码应该改成这样   
  23.                         Map.Entry<Integer, String> me=it.next();
  24.                         System.out.println(me.getKey()+"="+me.getValue());
  25. ___________________________________________
  26.                 }
  27.         }
  28. }
复制代码

作者: 赵宇    时间: 2012-9-22 12:43
本帖最后由 疯子雨 于 2012-9-22 12:44 编辑
  1. 06.class MapTest

  2. 07.{

  3. 08. public static void main(String[] args){

  4. 09. Map<Integer, String> map = new HashMap<Integer, String>();

  5. 10. method_3(map);

  6. 11. }

  7. 12.

  8. 13. public static void method_3(Map<Integer, String> map) {

  9. 14. map.put(13, "wangcai");

  10. 15. map.put(12, "zhangsan");

  11. 16. map.put(14, "wangwu");

  12. 17. map.put(11, "zhaoliu");

  13. 18.

  14. <FONT color=red>19. Set<Map.Entry<Integer, String>> entrySet = map.entrySet();                            <FONT color=red>//Map.Entry 是一个内部类,里面维护着 Key、Value 的值
  15. </FONT>20. for(Iterator<Map.Entry<Integer, String>> it = entrySet.iterator(); it.hasNext(); ){    //<FONT color=red>所以通过 getkey()、和getvalue()可以直接获得值。</</FONT>FONT>

  16. 21. System.out.println(it.next().getKey()+"="+it.next().getValue());

  17. 22. }

  18. 23. }

  19. 24.},
复制代码

作者: 梁志冰    时间: 2012-9-22 12:50
这是因为你的打印输出语句中使用了两个it.next()的缘故,当使用第1个it.next()取出Key的值后,指针已经指向下一个Key啦,这时你使用it.next()取value时,取出的就是下一个的key值对应的value啦!所以会出现你这样的输出结果
作者: 杨卫腾    时间: 2012-9-22 13:21
程金 发表于 2012-9-22 12:42

谢谢哥们,  我把两次调用it.next()这茬给忽略了。   
作者: 汪小照    时间: 2012-9-22 13:31
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
class MapTest
{
        public static void main(String[] args){               
                Map<Integer, String> map = new HashMap<Integer, String>();
                method_3(map);
        }        
        public static void method_3(Map<Integer, String> map) {
                map.put(13, "wangcai");
                map.put(12, "zhangsan");
                map.put(14, "wangwu");
                map.put(11, "zhaoliu");        
               
                Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
                for(Iterator<Map.Entry<Integer, String>> it = entrySet.iterator(); it.hasNext(); ){
                      //  System.out.println(it.next().getKey()+"="+it.next().getValue());
      //修改后的代码
      Map.Entry<Integer,String> entry = it.next();
       Integer i = entry.getKey();
       String str = entry.getValue();
       System.out.println(i+"="+str);
                }
        }
}

/*
        应该 把System.out.println(it.next().getKey()+"="+it.next().getValue());
       改成如下代码:
       Map.Entry<Integer,String> entry = it.next();
       Integer i = entry.getKey();
       String str = entry.getValue();
       System.out.println(i+"="+str);

      分析如下:
     由于采用的是HashMap集合,所以键值对放入内存中,由HashMap集合的底层结构是Hash表的数据结构,所以在存入键值对时,
会自动调用hashCode和equals方法,对键值对进行排序,在内存中排序后的结果为:
              11,"zhouliu"
              12, "zhangsan"
              13, "wangcai"
              14,"wangwu"
在System.out.println(it.next().getKey()+"="+it.next().getValue())这条语句中,首先执行it.next().getKey()语句,返回的是11,由于
it.next().getValue())这条语句又有一个it.next(),此时拿到的是第二个对象,所以取到的值为"zhansan"。第二次在执行打印语句时,同理得到的
结果是13="wangwu".所以由于这样的原因才得到了你那样的结果。

代码改变后可以得到正确的输出结果:


      */

1.jpg (7.25 KB, 下载次数: 15)

正确运行结果

正确运行结果

作者: 杨卫腾    时间: 2012-9-22 14:29
汪小照 发表于 2012-9-22 13:31
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;

哥们  分析的很到位。谢谢了!




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