文档章节

Java 之HashMap.values()方法误用

Airship
 Airship
发布于 2017/02/16 16:10
字数 406
阅读 70
收藏 0

精选30+云产品,助力企业轻松上云!>>>

1.出错

   今天在测试代码的时候发现程序报错,看代码才知道是使用HashMap.values()方法的时候出错。因为项目中需要获取Map的值的集合然后进行遍历,所以就很自然的调用了HashMap.values()方法,如下所示

package collections;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class Test {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
          
        Map<String,String> map = new HashMap<String,String>();
        map.put("A", "A");
        map.put("B", "B");
        map.put("C", "C");
        map.put("D", "D");
        map.put("E", "E");
        List<String> valuesList = (List<String>) map.values();
        for(String str:valuesList){
            System.out.println(str);
        }
    }
 
}

 

运行时候抛出异常,异常信息如下:

Exception in thread "main" java.lang.ClassCastException: java.util.HashMap$Values cannot be cast to java.util.List
    at collections.Test.main(Test.java:20)

  2.错误原因分析

  首先找到了values()方法所在的源码,信息如下:

public Collection<V> values() {
      Collection<V> vs = values;
      return (vs != null ? vs : (values = new Values()));
  }


  原来values()方法只是返回了一个Collection集合,可是如程序中的用法所示,在向下转型的时候出现了类型转换错误。那我们应该怎么才能获取自己想要的结构呢?

3.解决方法

  在ArrayList中,有一个构造函数

public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
}

  可以接受一个集合类型的参数,然后返回一个list;这样就达到了预期目的。代码如下

package collections;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class Test {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
          
        Map<String,String> map = new HashMap<String,String>();
        map.put("A", "A");
        map.put("B", "B");
        map.put("C", "C");
        map.put("D", "D");
        map.put("E", "E");
        //List<String> valuesList = (List<String>) map.values();
        List<String> valuesList = new ArrayList<String>(map.values());
        for(String str:valuesList){
            System.out.println(str);
        }
    }
 
}

 

Airship
粉丝 51
博文 1147
码字总数 24098
作品 0
南京
高级程序员
私信 提问
加载中
请先登录后再评论。
【面试题每日学习】14

1.为什么迭代器的 next() 返回的是 Object 类型? 答:因为迭代器不需要关注容器的内部细节,所以 next() 返回 Object 类型就可以接收任何类型的对象。 2.HashMap 的遍历方式都有几种? 答:...

JaneRoad
05/06
4
0
Java编程最差实践

osc_3www0d3o
2018/06/11
2
0
Java assert 关键字使用

关于Java assert关键字的使用,参考Stack Overflow的高票回答: What are some real life examples to understand the key role of assertions? Assertions (by way of the assert keyword) ......

Acce1erator
2017/10/18
75
0
【转】不正当使用HashMap导致cpu 100%的问题追究

因最近hashmap误用引起的死循环又发生了一些案例,左耳朵浩子写了一篇blog 疫苗:Java HashMap的死循环,看了一下,大家的分析如出一辙。这篇blog也是好几年前写的了,之前在平台技术部的博客...

carribean
2015/07/29
102
0
Java编程最差实践(五)

不使用finally块释放资源 错误的写法: public void save(File f) throws IOException { OutputStream out = new BufferedOutputStream(new FileOutputStream(f)); out.write(...); out.close......

六月雨
2014/09/17
215
0

没有更多内容

加载失败,请刷新页面

加载更多

在Python中从字符串转换为布尔值? - Converting from a string to boolean in Python?

问题: Does anyone know how to do convert from a string to a boolean in Python? 有谁知道如何在Python中从字符串转换为布尔值? I found this link . 我找到了此链接 。 But it doesn't......

javail
16分钟前
19
0
中国饭店协会数据表明

记者了解到,中国饭店协会数据表明,2018年全国餐饮收入42716亿元,同比增长9.5%.根据国家统计局数据显示,截至2017年底,限额以上餐饮行业的从业人数达到2232万人,巨大的餐饮市场背后,餐饮行业的...

asd369
38分钟前
29
0
OSChina 周六乱弹 —— 日本的丧尸光天化日之下都开始……

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《風の手枕》- 増田俊郎 手机党少年们想听歌,请使劲儿戳(这里) @码界农民工 :...

小小编辑
50分钟前
26
0
Hacker News 简讯 2020-07-11

更新时间: 2020-07-11 02:01 The TikTok app is no longer permitted on mobile devices that access Amazon email - (twitter.com) TikTok应用程序不再允许在访问亚马逊电子邮件的移动设备上......

FalconChen
今天
155
0
是否有可能从另一个git存储库中挑选一个提交? - Is it possible to cherry-pick a commit from another git repository?

问题: I'm working with a git repository that needs a commit from another git repository that knows nothing of the first. 我正在使用一个git存储库,需要从另一个不知道第一个存储库......

技术盛宴
昨天
29
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部