黑马程序员技术交流社区

标题: Map集合中Map.Entry<K,V>的问题 [打印本页]

作者: 黑马十八期0513    时间: 2012-12-15 10:08
标题: Map集合中Map.Entry<K,V>的问题
import java.util.*;
class MapDemo2
{
      public static void main(String[] args)
    {
            HashMap<String,String> map=new HashMap<String,String>();
            map.put("o2","zhangshan02");
            map.put("o3","zhangshan04");
           map.put("o1","zhangshan01");
           map.put("o4","zhangshan04");
  
          Set<Map.Entry <String,String>> entrySet=map.entrySet();
         for(Iterator<Map.Entry <String,String>> it =entrySet.iterator();it.hasNext();)
       {
               Map.Entry <String,String> me =it.next();   
              String key =me.getKey();   
             String value =me.getValue();
            System.out.println(key+":"+value);
      }
  }
}
这段代码提出来独立运行一点儿问题都没有,编译运行都能通过。但是在下面这一段代码中死活编译不能通过,很奇怪!下面这行代码也就多了注释,其它的一个字都没有改动。


/*
Map集合的两种取出方式:
1 Set<K> keySet:将map中所有的键存入到Set集合。
因为Set集合具备迭代器,所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值
2 Set<Map.Entry<K,V>> entrySet:将Map集合中的映射关系存入到了Set集合中,而这个关系的数据类型就是:Map.Entry
*/
import java.util.*;
class MapDemo2
{
public static void main(String[] args)
{
  HashMap<String,String> map=new HashMap<String,String>();
  map.put("o2","zhangshan02");
  map.put("o3","zhangshan04");
  map.put("o1","zhangshan01");
  map.put("o4","zhangshan04");
  
  
  //Map集合取出方式2:将Map集合中的映射关系取出,存入到Set集合中。
  Set<Map.Entry <String,String>> entrySet=map.entrySet();
  /*
  entrySet方法的返回值是Set集合,Set集合存入的类型是Map.Entry<K,V>,
  K,V分别指键类型和值类型。本例中key的类型和value的类型同为String
   Map.Entry<K,V> 是一个接口,存入类型必须是<K,V>
  */
  for(Iterator<Map.Entry <String,String>> it =entrySet.iterator();it.hasNext();)
  {
   Map.Entry <String,String> me =it.next();    //Map.Entry是一个接口,详见API文档
   String key =me.getKey();     //调用Map.Entry接口的方法
   String value =me.getValue();
   System.out.println(key+":"+value);
  }
  

  /*
  Map集合取出方式1:
  //先获取Map集合的所有键的Set集合,keySet();
  Set<String> keySet =map.keySet();
  //有了Set集合就可以获取其迭代器
  for(Iterator<String> it =keySet.iterator();it.hasNext();)
  {
   String key =it.next();
   //有了键可以通过Map集合的get方法获取其对应的值。
   String value =map.get(key);
   
   System.out.println("key:"+key+",value:"+value);
  }
  */
}
}

/*
Map.Entry  其实Entry也是一个接口,它是Map接口中的一个内部接口。
*/
/*
interface Map
{
public static interface Entry
{
  public abstract Object getKey();
  public abstract Object getValue();
}
}
*/
相同的代码,只是多了注释,编译时就提示 Map.Entry不带有参数。我在想是不是虚拟机把Map.Entry后面跟的泛型当成参数了?

未命名.jpg (62.74 KB, 下载次数: 39)

Map.Entry不带有参数

Map.Entry不带有参数

作者: Kevin123    时间: 2012-12-15 10:49
把楼主的加注释后的代码复制粘贴运行了一下,编译成功。
建议楼主在重启一下试试。


作者: 黑马十八期0513    时间: 2012-12-15 11:11
白良锦 发表于 2012-12-15 10:49
把楼主的加注释后的代码复制粘贴运行了一下,编译成功。
建议楼主在重启一下试试。

昨天晚上就出现了这个问题了,今天早上开电脑后仍然有这个问题。我在想会不会是我JDK的问题,我用的是JDK7.0版本
作者: 梁小波    时间: 2012-12-15 11:15
看了许久,没找到错误!
后来试了一下也买有错误;于是我把
/*
interface Map
{
public static interface Entry
{
  public abstract Object getKey();
  public abstract Object getValue();
}
}
*/的注释去掉,终于出现了和楼主一样的错误

我想了一下,可能是楼主的不小心!如果你是有意这样的?很显然,你不可以这样做,
但是我们能否用自己定义的接口来覆盖原来的接口呢?
于是我在Entry接口中加入了泛型!
但是有了提示:(在eclipse下)
Type mismatch: cannot convert from java.util.Set<java.util.Map.Entry<com.reLearn.String,com.reLearn.String>> to java.util.Set<com.reLearn.Map.Entry<com.reLearn.String,com.reLearn.String>>
可以看出我们的做法不可以!因为entrySet()方法的返回值是不可以转换类型的!
所以我想:这样覆盖是欠妥的。
个人观点,欢迎指正
作者: 黑马十八期0513    时间: 2012-12-15 11:35
标题: RE: Map集合中Map.Entry&lt;K,V&gt;的问题
梁小波 发表于 2012-12-15 11:15
看了许久,没找到错误!
后来试了一下也买有错误;于是我把
/*

看了朋友你的解答,我终于找到了错误!因为我之前
interface Map
{
public static interface Entry
{
  public abstract Object getKey();
  public abstract Object getValue();
}
}
这段代码没有被我注释,被我编译出来了。刚才看了你的回复,在想是不是自己把Map.Entry接口给重写了,结果在文件夹里一看,果然有一个map.class文件,Map.Entry接口确实被我重写了!谢谢!





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