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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 叶征东 中级黑马   /  2012-9-20 23:52  /  1851 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 叶征东 于 2012-9-21 11:35 编辑

HashMap<String,Integer> maps = new HashMap<String, Integer>();
  maps.put("zxx", 26);
  maps.put("lhm", 35);
  maps.put("flx", 33);
----------------------------------------------------------------------------------------------------------------
                                                                     //--------------------(1)
  Set<Map.Entry<String , Integer>> entrySet = maps.entrySet();
  for (Map.Entry<String, Integer> entry : entrySet) {
   System.out.println(entry.getKey() + ":" + entry.getValue());
  }
                                                                        //--------------------(2)
  Set<Entry<String , Integer>> entrySet1 = maps.entrySet();
  for (Map.Entry<String, Integer> entry : entrySet1) {
   System.out.println(entry.getKey() + ":" + entry.getValue());
  }
                                                                      //--------------------(3)
  Set<Map.Entry<String , Integer>> entrySet2 = maps.entrySet();
  for (Entry<String, Integer> entry : entrySet2) {
   System.out.println(entry.getKey() + ":" + entry.getValue());
  }
                                                                   //--------------------(4)
  Set<Entry<String , Integer>> entrySet3 = maps.entrySet();
  for (Entry<String, Integer> entry : entrySet3) {
   System.out.println(entry.getKey() + ":" + entry.getValue());
  }
(1),(2),(3),(4)除了红色的部分,其它的都是一样的.
(1),(2),(3),(4)输出的结果都是一样的.
本来是想写成(1)的样子的,结果不小心写成了(3)的样子,发现结果一样,就把(2)和(4)也试了一下.
(1),(2),(3),(4)有区别么?如果有,能给我讲讲么?谢谢.

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
楼主其实问的是map.entry和entry的关系。

可以看api:

1.在Interface Map<K,V>内部有个嵌套类(Nested Class Summary):static interface Map.Entry<K,V>

2.可以查看Interface Map.Entry<K,V>,他有:getKey() ;getvalue()等方法。

3.什么是Entry?查了下api,没有Entry这个类,我就猜测是不是jdk以前版本的,又查了下不是,jdk1.2就叫map.entry;网上找了下,没人说到entry,都是讲map.entry的。但是直接写entry也是正确的。

4.后来自己又写了些代码,发现在使用Entry时,import的包是java.util.Map;而使用Map.entry,引用的包是java.util.Map.Entry;两种形式都用的话,这两个包都要import。

5.其实发现,mapEntry就是Entry,使用的不同是因为import导入的包不同,当然import应该是根据你的代码自动生成的。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
完全同意楼上的意见!
当我一看到你写的这个,我还以为是Map下的静态方法呢?结果不是,而是Set集合下的Map.entry,结果在网上也没找到答案。
最后一看导入的包结构好像有点眉目了,结果又有点不对。

这是Eclipse中提供的注释!
entrySet方法返回一个集合视图的映射,其元素的这类。唯一的方法来获取一个引用映射条目从迭代器的集合视图。这些地图。条目对象仅适用于时间的迭代;更正式,的行为是未定义的映射条目,如果备份映射被修改后返回的条目是迭代器,除非通过setValue操作映射条目,我看到这,把我给乐了,这个原来是jdk1.2版本上的,是很早的了(可惜我没下载,没找到),所以java.Util.Map.Entry就这样给简化了。
(我是把能涉及的集合类都找了一遍,就是没有找到Entry这个类或者是方法,我还纳闷了,就是没有源码,我觉得这就是用的装饰类来做了个接口的扩展,然后用注释了,可以用,但API中没有必要再提供这个抽象方法)所以,现在编程中都这样写了,你这个不报错的原因就是对接口性能提升了!

都知道MAP是键值对的形式存在,而Map.Entry返回的是Set集合,而Set就是存储的键,会把所有的遍历出来,所以才会,如果要查询集合中的数据,使用Set必须全部遍历,所以查询的效率低。使用Map,可通过查找key得到value,查询效率高。
回复 使用道具 举报
正如你看到的那样 其实map是set的扩展
回复 使用道具 举报
张 涛 发表于 2012-9-21 00:46
楼主其实问的是map.entry和entry的关系。

可以看api:

谢谢!                     
回复 使用道具 举报
陈振兴 发表于 2012-9-21 01:24
完全同意楼上的意见!
当我一看到你写的这个,我还以为是Map下的静态方法呢?结果不是,而是Set集合下的Map ...

谢谢!                              
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马