我有一些相对简单的代码,应该检索到HashMap&的迭代器。打印出密钥对值。
我的问题是,当我去检索迭代器时,我会抛出这个异常。
线程“main”中的异常java.lang.ClassCastException:java.util.HashMap $ Entry无法强制转换为java.lang.String
在Delete.main(Delete.java:25)
这是我的代码&我指出第25行是:
Map <String, UpdatablePage> contentMap = new HashMap <String, UpdatablePage>();
contentMap.put( "test", new UpdatablePage() );
for ( Iterator it = (Iterator) contentMap.entrySet().iterator(); it.hasNext(); )
{
String key = (String) it.next(); // LINE 25
UpdatablePage value = contentMap.get(key);
System.out.print( "Key=" + key + ", Value=" + value.toString() );
}
PS,我试图使用Map.Entry迭代一个地图,但是当我将迭代器返回的值转换为Map.Entry时,我得到另一个转换异常,为什么?
// Error occurs when I do the following
Map.Entry pair = (Map.Entry) it.next();
答案 0 :(得分:4)
在这一行: for(Iterator it =(Iterator)contentMap.entrySet()。iterator(); it.hasNext();)
entrySet()应该是keySet() - 你的迭代器返回每个条目但是当你把它们转换为String时,我认为它是你想要的键。
答案 1 :(得分:2)
在迭代条目集时,您将返回Map.Entry
个对象,然后您可以使用getKey()
和getValue()
来提取密钥和值。无需迭代密钥并单独提取值(效率低得多)。
顺便说一句,你不会将迭代器转换为Map.Entry,而是迭代器在每次迭代时返回的对象。
答案 2 :(得分:1)
使用keySet()和通用迭代器获得最佳结果:
Map<String, UpdatablePage> contentMap = new HashMap<String, UpdatablePage>();
contentMap.put("test", new UpdatablePage());
for (Iterator<String> it = contentMap.keySet().iterator(); it.hasNext();) {
String key = it.next();
UpdatablePage value = contentMap.get(key);
System.out.print("Key=" + key + ", Value=" + value.toString());
}
使用泛型迭代器,根本不需要任何强制类型转换,并且您可以获得编译时类型检查的好处,而不是您所看到的运行时异常。