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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-小龙 中级黑马   /  2013-1-25 21:45  /  1978 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-26 11:44 编辑

public class MapDemo3 {
/**
  * @param args
  */
public static void main(String[] args) {
  Map map = new HashMap();
  map.put("Jack", 19);
  map.put("Rose", 23);
  Set<Map.Entry> entryset = map.entrySet();
  Iterator it = entryset.iterator();
  while (it.hasNext()) {
   Map.Entry entry = (Entry) (it.next());//此处为什么需要转型呢?iteator迭代出来后的数据,不也是map类型的吗?
   Object key = entry.getKey();
   Object value = entry.getValue();
   System.out.println(key + "" + value);
  }
}
}
   Map.Entry entry = (Entry) (it.next());//此处为什么需要转型呢?iteator迭代出来后的数据,不也是map类型的吗?
求大神解释下

评分

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

查看全部评分

6 个回复

倒序浏览
Entry是Map中的内部类,他是把每一对Key和value记录一个关系。通过迭代这个关系就可以获取这个关系所对应的Key和value
回复 使用道具 举报

public class MapDemo3 {
/**
  * @param args
  */
public static void main(String[] args) {
  Map map = new HashMap();
  map.put("Jack", 19);
  map.put("Rose", 23);
  Set<Map.Entry> entryset = map.entrySet();
  Iterator it = entryset.iterator();
  while (it.hasNext()) {
   Map.Entry entry = (Entry) (it.next());//此处为什么需要转型呢?iteator迭代出来后的数据,不也是map类型的吗?
//   iterator迭代出来的实际类型是Map.Entry,不过由于你在定义迭代器的时候没有指定类型,所以编译器认为迭代的是 Object,所以需要转型
//   只要改成Iterator<May.Entry> it=entryset.iterator()就不用转型了

   Object key = entry.getKey();
   Object value = entry.getValue();
   System.out.println(key + "" + value);
  }
}
}

评分

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

查看全部评分

回复 使用道具 举报
Map是通过键值队来存储的,所以可以通过Map.Entry封装的getKey和getValue方法来找到key和value。
还有种方法也可以取到key和value
//先获取map集合的所有键的Set集合,keySet();
                Set<String> keySet = map.keySet();

                //有了Set集合。就可以获取其迭代器。
                Iterator<String> it = keySet.iterator();

                while(it.hasNext())
                {
                        String key = it.next();
                        //有了键可以通过map集合的get方法获取其对应的值。
                        String value  = map.get(key);
                        System.out.println("key:"+key+",value:"+value);
                }
回复 使用道具 举报
本帖最后由 黄金龙 于 2013-1-25 22:04 编辑

Set<Map.Entry<K,V>> 这是支持泛型的....你不写别人知道你里面是什么吗?没指定的话后面是要强转的...
就好像
Fu f = new Zi();后面调用Zi的方法也是要强转的
Zi z = (Zi) f;
回复 使用道具 举报
Map.Entry entry = (Entry) (it.next());//此处为什么需要转型呢?iteator迭代出来后的数据,不也是map类型的吗?
首先 你这句是错的。应该写为(Map.entry)(it.next())。
你之所以问这个问题是因为你没有理解透彻迭代器。迭代器是可以加泛型的,如果你的迭代器在创建的时候没有指定泛型,那么编译的时候编译器会提示你 未经检查或者不安全。而正是因为迭代器可以操作很多类型的数据,而你又没有明白的告诉迭代器它所操作的数据是什么类型的(也就是没给迭代器添加泛型),所以迭代器为了不出错,返回的全部都是Object类型的,而很显然Object类型的数据并不是我们想要的,所以你必须手动的强制它转型为我们想要的数据类型(Map.Entry)。
如果你在定义迭代器的时候指定泛型的话,那么在这里你就不用强转了。代码如下所示
  1. Iterator<Map.Entry> it = entryset.iterator();
复制代码

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 很给力!

查看全部评分

回复 使用道具 举报
谢谢2楼,解释的很详细哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马