黑马程序员技术交流社区

标题: Map和Set的问题,输出结果不明白 [打印本页]

作者: wangpan    时间: 2013-6-7 11:04
标题: Map和Set的问题,输出结果不明白
本帖最后由 wangpan 于 2013-6-18 09:34 编辑

HashMap<String,Integer> maps =new HashMap<String,Integer> ();
maps.put("zxx", 28);
maps.put("lhm", 35);
maps.put("fix", 33);
//Map是不能直接进行迭代的,因为Map没有实现iterable接口
//要把Map编程Set,Set里面装着每个Entry,然后利用Set进行迭代
Set<Map.Entry<String,Integer>> entrySet  = maps.entrySet();
for(Map.Entry<String, Integer> entry:entrySet){
        System.out.println(entry.getKey() + ":" + entry.getValue());
}

输出结果为:
fix:33
zxx:28
lhm:35

这个输出结果是按什么顺序输出的呢?为什么跟map.put方法的顺序不一样啊
作者: w270307032    时间: 2013-6-7 11:27
HashMap和Hashset底层用的都是hash机构,放进去后会根据hashCode()方法,算出hash值然后,觉得放在集合的哪个位置的,所以本来就输无序(放进去的顺序和取出的顺序不一定一致)。
作者: wangpan    时间: 2013-6-7 11:40
w270307032 发表于 2013-6-7 11:27
HashMap和Hashset底层用的都是hash机构,放进去后会根据hashCode()方法,算出hash值然后,觉得放在集合的哪 ...

根据你所说的,那我又加了黄色标注的那句,
HashMap<String,Integer> maps =new HashMap<String,Integer> ();
  maps.put("zxx", 28);
  maps.put("lhm", 35);
  maps.put("fix", 33);
  //Map是不能直接进行迭代的,因为Map没有实现iterable接口
  //要把Map编程Set,Set里面装着每个Entry,然后利用Set进行迭代
  //注意=左边的参数化类型,entrySet()方法的返回值是Set<Map.Entry<K,V>>泛型类型
  Set<Map.Entry<String,Integer>> entrySet  = maps.entrySet();
  for(Map.Entry<String, Integer> entry:entrySet){
   System.out.println(entry.hashCode());
   System.out.println(entry.getKey() + ":" + entry.getValue());
  }

输出结果为:
101428
fix:33
121062
zxx:28
107090
lhm:35
这也没什么规律啊?难道是随机保存的?

作者: 蚂蚁搬家    时间: 2013-6-7 12:44
wangpan 发表于 2013-6-7 11:40
根据你所说的,那我又加了黄色标注的那句,
HashMap maps =new HashMap ();
  maps.put("zxx", 28);

他是按照hash算法运算的,hash算法如何运算咱都不知道,这要问java公司的人了




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