检索 HashMap 的迭代器会引发强制转换异常

Posted

技术标签:

【中文标题】检索 HashMap 的迭代器会引发强制转换异常【英文标题】:Retrieving an iterator for a HashMap throws a cast exception 【发布时间】:2011-07-01 00:41:39 【问题描述】:

我编写了一些相对简单的代码,用于检索 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();

【问题讨论】:

【参考方案1】:

当迭代条目集时,您会返回 Map.Entry 对象,然后您可以在其上使用 getKey()getValue() 来提取键和值。无需迭代键并单独提取值(效率低得多)。

顺便说一句,您不会将 iterator 转换为 Map.Entry,而是将迭代器在每次迭代时返回的对象。

【讨论】:

【参考方案2】:

使用 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());
  

使用泛型迭代器,根本不需要任何类型转换,而且您会获得编译时类型检查的好处,而不是您所看到的运行时异常。

【讨论】:

更好的是,使用增强版。【参考方案3】:

在这一行: for (Iterator it = (Iterator) contentMap.entrySet().iterator(); it.hasNext(); )

entrySet() 应该是 keySet() - 你的迭代器返回每个条目,但是当你将它们转换为 String 时,我认为它是你想要的键。

【讨论】:

以上是关于检索 HashMap 的迭代器会引发强制转换异常的主要内容,如果未能解决你的问题,请参考以下文章

scala强制转换不兼容类型而不会引发错误

检索 scope_identity 时指定的强制转换无效

将 HashMap 加载到嵌套配置 bean 会引发绑定异常

递归或迭代地从 HashMap 中检索键值组合

JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)

Java8 HashMap源码分析