黑马程序员技术交流社区
标题: 急!帖子好像没有发成功,再发一遍:Map集合中Map.Entry<K,V> [打印本页]
作者: 黑马十八期0513 时间: 2012-12-15 10:03
标题: 急!帖子好像没有发成功,再发一遍: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后面跟的泛型当成参数了?
作者: 一帆风顺 时间: 2012-12-15 12:53
我试运行了下,并且把注释挪了一下位置,两段代码都是可以运行的。
你说的的第二段代码也是可以的。
你说的那种情况是当你写的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接口中的一个内部接口。
*/
作者: 黑马十八期0513 时间: 2012-12-17 11:25
王博 发表于 2012-12-15 12:53
我试运行了下,并且把注释挪了一下位置,两段代码都是可以运行的。
你说的的第二段代码也是可以的。
谢谢,问题已经解决了。是你说的那样的,我把Map.Entry接口给复写出来了,而且编译产生了一个Map.class文件,当我在代码中调用Map.Entry接口时,虚拟机会直接调用我自己编译出来的Map.class文件,而不会调用java.util包里的Entry接口。我自己写的Map.Entry接口没有定义泛型,也没有写出具体的方法,所以会出错,谢谢!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |