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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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后面跟的泛型当成参数了?

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
我试运行了下,并且把注释挪了一下位置,两段代码都是可以运行的。
你说的的第二段代码也是可以的。

你说的那种情况是当你写的Map接口没有注释的时候会出现

/*
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");
              Set<Map.Entry <String,String>> entrySet=map.entrySet();  //Map集合取出方式2:将Map集合中的映射关系取出,存入到Set集合中。
  
              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);
              }
  
    }
}
/*
interface Map                                                       //这里当没有注释的时候会出现你说的问题,注释就好了。
{
       public static interface Entry
       {
                public abstract Object getKey();
                public abstract Object getValue();
       }
}
  entrySet方法的返回值是Set集合,Set集合存入的类型是Map.Entry<K,V>
  K,V分别指键类型和值类型。本例中key的类型和value的类型同为String
   Map.Entry<K,V> 是一个接口,存入类型必须是<K,V>
  */
  /*
  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接口中的一个内部接口。
*/

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王博 发表于 2012-12-15 12:53
我试运行了下,并且把注释挪了一下位置,两段代码都是可以运行的。
你说的的第二段代码也是可以的。

谢谢,问题已经解决了。是你说的那样的,我把Map.Entry接口给复写出来了,而且编译产生了一个Map.class文件,当我在代码中调用Map.Entry接口时,虚拟机会直接调用我自己编译出来的Map.class文件,而不会调用java.util包里的Entry接口。我自己写的Map.Entry接口没有定义泛型,也没有写出具体的方法,所以会出错,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马