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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangpan 中级黑马   /  2013-6-7 11:04  /  1606 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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方法的顺序不一样啊

3 个回复

倒序浏览
HashMap和Hashset底层用的都是hash机构,放进去后会根据hashCode()方法,算出hash值然后,觉得放在集合的哪个位置的,所以本来就输无序(放进去的顺序和取出的顺序不一定一致)。
回复 使用道具 举报
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
这也没什么规律啊?难道是随机保存的?
回复 使用道具 举报
wangpan 发表于 2013-6-7 11:40
根据你所说的,那我又加了黄色标注的那句,
HashMap maps =new HashMap ();
  maps.put("zxx", 28);

他是按照hash算法运算的,hash算法如何运算咱都不知道,这要问java公司的人了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马