黑马程序员技术交流社区

标题: Map转换的一个问题 [打印本页]

作者: 黑马-小龙    时间: 2013-1-25 21:45
标题: Map转换的一个问题
本帖最后由 张向辉 于 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类型的吗?
求大神解释下

作者: 刘军亭    时间: 2013-1-25 21:52
Entry是Map中的内部类,他是把每一对Key和value记录一个关系。通过迭代这个关系就可以获取这个关系所对应的Key和value
作者: 黑马张英涛    时间: 2013-1-25 21:53

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);
  }
}
}
作者: 唐晓    时间: 2013-1-25 22:00
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:01
本帖最后由 黄金龙 于 2013-1-25 22:04 编辑

Set<Map.Entry<K,V>> 这是支持泛型的....你不写别人知道你里面是什么吗?没指定的话后面是要强转的...
就好像
Fu f = new Zi();后面调用Zi的方法也是要强转的
Zi z = (Zi) f;

作者: 胡勇敏    时间: 2013-1-25 22:04
Map.Entry entry = (Entry) (it.next());//此处为什么需要转型呢?iteator迭代出来后的数据,不也是map类型的吗?
首先 你这句是错的。应该写为(Map.entry)(it.next())。
你之所以问这个问题是因为你没有理解透彻迭代器。迭代器是可以加泛型的,如果你的迭代器在创建的时候没有指定泛型,那么编译的时候编译器会提示你 未经检查或者不安全。而正是因为迭代器可以操作很多类型的数据,而你又没有明白的告诉迭代器它所操作的数据是什么类型的(也就是没给迭代器添加泛型),所以迭代器为了不出错,返回的全部都是Object类型的,而很显然Object类型的数据并不是我们想要的,所以你必须手动的强制它转型为我们想要的数据类型(Map.Entry)。
如果你在定义迭代器的时候指定泛型的话,那么在这里你就不用强转了。代码如下所示
  1. Iterator<Map.Entry> it = entryset.iterator();
复制代码

作者: 黑马-小龙    时间: 2013-1-25 22:21
谢谢2楼,解释的很详细哦




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