Java之HashMap.values()转List时的错误和正确演示

目录
  • HashMap.values()转List时的错误和正确演示
    • 错误原因
    • 解决方法
  • Map的Value值转换为List集合
  • 总结

HashMap.values()转List时的错误和正确演示

因为项目中需要获取到Map的值的集合,所以调用了HashMap.values()方法转成List,当时是使用了以下代码。

(逻辑上这样想应该没问题,但生活总是会是不是给你一点小“”惊喜“”)

List<AreaItemOpt> areaItemOpts = (List<AreaItemOpt>) areaItemOptMap.values();
return areaItemOpts;

怀着喜悦的心情在测试环境中运行之后,它报错了!

报错如下:

java.lang.ClassCastException: java.util.HashMap$Values cannot be cast to java.util.List

错误原因

于是翻了一下values()方法的源码

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

原来values()方法只是返回了一个Collection集合,可是如程序中的用法所示,在向下转型的时候出现了类型转换错误。

解决方法

在ArrayList中,有一个构造函数

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

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

代码如下:

List<AreaItemOpt> areaItemOpts = new ArrayList<>(areaItemOptMap.values());
return areaItemOpts;

测试通过~

发现还有一种方法也可以解决这个问题:

 List<T> list=(List<T>) Arrays.asList(map.values().toArray());//先转数组再转list

Map的Value值转换为List集合

不多废话,直接看代码,有注解

public class Map转List {
    public static void main(String[] args) {
        //开辟空间
        HashMap<Integer,String> hashMap = new HashMap<Integer,String>();
        //存入数据
        hashMap.put(1,"张三");
        hashMap.put(2,"李四");
        hashMap.put(3,"王五");
        //使用Collection类型接收HashMap的Value值
        Collection<String> collection = hashMap.values();
        //把Collection对象作为参数传入ArrayList构造方法完成类型转换
        ArrayList<String> arrayList = new ArrayList<String>(collection);
        //输出测试
        System.out.println(arrayList.toString());
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java中HashMap.values()转为ArrayList()问题

    目录 HashMap.values()转为ArrayList() map.values()转为List和ArrayList的复制 总结 HashMap.values()转为ArrayList() 由于HashMap.values()只能转为Collection集合所以需要转为ArrayList的话可以用一下代码 ArrayList<Integer> al = new ArrayList(hash.values()); map.values()转为List和ArrayList的复制 packag

  • Java中关于Map四种取值方式

    目录 Java关于Map的四种取值方式 map的主要作用是什么? Java中Map取值转String Null值处理 总结 Java关于Map的四种取值方式 map的主要作用是什么? 可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数据 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口. Map 接口提供三种collection 视图,允许以键集.值集或键-值映

  • Java高级之HashMap中的entrySet()方法使用

    目录 基本使用 原理剖析 总结 基本使用 entrySet()方法得到HashMap中各个键值对映射关系的集合. 然后Map.Entry中包含了getKey()和getValue()方法获取键和值. 示例: public class Demo { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("abc", "123&

  • java中Map和List初始化的N种方法总结

    目录 Map和List初始化方法 第一种方法(常用方法) 第二种方法(双括号初始化法) 第三种,stream初始化 初始化Map和List小技巧(指定容量+匿名内部类初始化) 总结 Map和List初始化方法 第一种方法(常用方法) //初始化List   List<string> list = new ArrayList<string><string>();   list.add("string1");   list.add("strin

  • Java中HashMap获取值的几种方式汇总

    目录 Java HashMap获取值的方式 Java HashMap基本用法 总结 Java HashMap获取值的方式 1.通过keySet()方法获取key的集合,因为在HashMap中key值不能重复,所以返回的是一个Set()类型. 2.通过entrySet()方法获取键值对的集合,再通过getKey()和getValue()方法获取key和value. 3.通过values()方法获取value集合,因为value可以重复,因此返回的类型为Collection. package com

  • Java之HashMap.values()转List时的错误和正确演示

    目录 HashMap.values()转List时的错误和正确演示 错误原因 解决方法 Map的Value值转换为List集合 总结 HashMap.values()转List时的错误和正确演示 因为项目中需要获取到Map的值的集合,所以调用了HashMap.values()方法转成List,当时是使用了以下代码. (逻辑上这样想应该没问题,但生活总是会是不是给你一点小“”惊喜“”) List<AreaItemOpt> areaItemOpts = (List<AreaItemOpt&g

  • Java之HashMap案例详解

    概述 这篇文章,我们打算探索一下Java集合(Collections)框架中Map接口中HashMap的实现.Map虽然是Collctions框架的一部分,但是Map并没有实现Collection接口,而Set和List是实现Collection接口的. 简单来说,HashMap主要通过key存储value值,并且提供了添加,获取和操作存储value的方法.HashMap的实现基于HashTable. HashMap内部呈现 Key-value对在内部是以buckets的方式存储在一起,最终成为

  • Java中HashMap和TreeMap的区别深入理解

    首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 TreeMap 非线程安全 线程安全 在Java里,线程安全一般体

  • java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    java 中HashMap.HashSet.TreeMap.TreeSet判断元素相同的几种方法比较 1.1     HashMap 先来看一下HashMap里面是怎么存放元素的.Map里面存放的每一个元素都是key-value这样的键值对,而且都是通过put方法进行添加的,而且相同的key在Map中只会有一个与之关联的value存在.put方法在Map中的定义如下. V put(K key, V value); 它用来存放key-value这样的一个键值对,返回值是key在Map中存放的旧va

  • java 中HashMap实现原理深入理解

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端.       数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1):数组的特点是:寻址容易,插入和删除困难: 链表 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N).链表的特点是:寻址困难,插入和删除容易. 哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提

  • Java数据结构-HashMap详解

    Java数据结构-HashMap 1. HashMap数据结构 没有哈希冲突时,为数组,支持动态扩容 哈希冲突时,分为两种情况: 1.当冲突长度小于8或数组长度小于64(MIN_TREEIFY_CAPACITY默认值为64)时,为数组+链表(Node) 2.当冲突长度大于8时,为数组+红黑树/链表(TreeNode). 红黑树用于快速查找,链表用于遍历. 2. 红黑树 HashMap中的TreeNode是红黑树的实现. TreeNode几个方法 1. 左旋转 static <K,V> Tree

  • java中hashmap容量的初始化实现

    HashMap使用HashMap(int initialCapacity)对集合进行初始化. 在默认的情况下,HashMap的容量是16.但是如果用户通过构造函数指定了一个数字作为容量,那么Hash会选择大于该数字的第一个2的幂作为容量.比如如果指定了3,则容量是4:如果指定了7,则容量是8:如果指定了9,则容量是16. 为什么要设置HashMap的初始化容量 在<阿里巴巴Java开发手册>中,有一条开发建议是建议我们设置HashMap的初始化容量. 下面我们通过具体的代码来了解下为什么会这么

  • Java 对HashMap进行排序的三种常见方法

    首先来看看Map集合获取元素的三种常见方法keySet().values().entrySet() 1. values(): 返回map集合的所有value的Collection集合(于集合中无序存放) import java.util.*; public class Main{ public static void main(String[] args){ Map<String, String> map = new HashMap<String, String>(); //构建键

  • Java中HashMap里面key为null存放到哪

    我们知道HashMap集合是允许存放null值的 hashMap是根据key的hashCode来寻找存放位置的,那当key为null时, 怎么存储呢? 在put方法里头,其实第一行就处理了key=null的情况. // HashMap的put方法 public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) // key为null调用putForNull

  • java集合类HashMap源码解析

    Map集合 Map集合存储的是键值对 Map集合的实现类: HashTable.LinkedHashMap.HashMap.TreeMap HashMap 基础了解: 1.键不可以重复,值可以重复: 2.底层使用哈希表实现: 3.线程不安全: 4.允许key为null,但只允许有一条记录为null,value也可以为null,允许多条记录为null: 源码分析 (一)以JDK1.7为例 1.存储结构 数据结构:数组+链表 首先hashmap内部有一个Entry类型的数组table: 通过Entr

随机推荐