java使用Arrays.asList快速创建List集合

程序中某段案例代码如下:

            Map<String, List<CronTrigger>> tMap = new HashMap<String, List<CronTrigger>>();
            tMap.put(name, Arrays.asList(new CronTrigger[] { trigger }));

程序运行抛出异常:java.lang.UnsupportedOperationException

错误原因:

为了快速创建List而使用了Arrays.asList方法,但此方法返回的ArrayList不是java.util.ArrayList对象,而是Arrays的一个内部类。

我们可以看下源码

Arrays.class:
 @SafeVarargs
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
---------------------------------------------------
private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;
        ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
            a = array;
        }
.....

上述代码中可以看出内部类ArrayList继承了AbstractList,但是没有重写其add方法和remove方法,AbstractList中相关代码如下:

public boolean add(E e) {
        add(size(), e);
        return true;
    }
public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
public E remove(int index) {
        throw new UnsupportedOperationException();
    }

这样就导致我们在把它当做java.util.ArrayList对象使用时调用方法add和remove会抛出 UnsupportedOperationException

解决方法:

1. 不使用Arrays.asList方法,直接new java.util.ArrayList(),然后依次添加对象(可能代码较多)。

2. 依然使用Arrays.asList方法,但是要加转换,代码如下:

tMap.put(name, new ArrayList<CronTrigger>(Arrays.asList(new CronTrigger[] { trigger })));
时间: 2024-08-11 07:48:34

java使用Arrays.asList快速创建List集合的相关文章

【转】java.util.Arrays.asList 的用法

DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.Arrays.asList的定义,函数参数是Varargs, 采用了泛型实现.同时由于autoboxing的支持,使得可以支持对象数组以及基本类型数组. 不过在使用时,当传入基本数据类型的数组时,会出现小问题,会把传入的数组整个当作返回的List中的第一个元素,例如: public static vo

java之Arrays.asList 的坑

1 引子 public static void main(String[] args) { String[] sArray = {"a", "b", "c", "d", "e"}; List<String> sList = Arrays.asList(sArray); //修改 List, 查看 Array 的值 sList.set(3, "cd"); System.out.

Java之Arrays.asList陷阱

http://www.cnblogs.com/treerain/p/Java_Arrays_asList.html Java.Util.Arrays可以将数组转换为List,具体的定义如下: @SafeVarargs public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } 可以看到实际上是将这个数组转换成为了ArrayList<>,看似没有问题,但是当我们使用add和re

java9新特性-12-集合工厂方法:快速创建只读集合

1.官方Feature 269: Convenience Factory Methods for Collections 2.产生背景 要创建一个只读.不可改变的集合,必须构造和分配它,然后添加元素,最后包装成一个不可修改的集合. 比如: 缺点:我们一下写了五行.即:它不能表达为单个表达式. 当然,我们也可以稍微简单点处理: 3.使用说明 Java9因此引入了方便的方法,这使得类似的事情更容易表达. List firsnamesList= List.of("Joe","Bob

java Arrays.asList

List<String> list = Arrays.asList("A B C D E F G H I J K L ".split(" ")); 1. java中Arrays.asList生成的集合是属于Arrays中内部类,这个内部类不支持各种 removeAll  retainAll 操作,会抛出 java.lang.UnsupportedOperationException 异常.因为Arrays.asList就表示生成固定大小的数组的集合,任何

Arrays.asList的用法:

Arrays.asList 返回数组而非List. List的一个典型的特性就是其长度是可变的,我们可以很方便地对它进行插入和删除元素的操作,这是它与数组所存在的一个很大的区别,后者的长度是固定的,而且我们不能从数组中删除元素,只能修改元素的值. 利用Arrays.asList(array)返回一个List,然而这个返回的是只读的List不支持add和remove的操作. JDK文档是这么说的: public static <T> List<T> asList(T... a) 返回

【Java基础】一个有意思的泛型方法Arrays.asList(T... a)

总结 利用Arrays.asList方法返回的List是不允许add和remove的,这种list的长度不可变,因为底层依然是写数组. Arrays.asList的返回值是调用是传入T类型的List,所以传入啥,返回啥的列表 T... a 底层本来就是转换为T[] x的数组,所以如果传入的T是数组,最后的底层参数是二维数组T[][] y. Arrays.asList(T... a)方法的作用 将数组转为集合的方法,返回的是List集合.和Collection的toArray对应,是数组和集合间相

Java中Arrays工具列的asList()方法的使用

public static <T> List<T> asList(T... a): 把数组转成集 注意事项: 虽然可以把数组转成集合,但是集合的长度不能改变. Demo: public class ArraysDemo { public static void main(String[] args) { // 定义一个数组 // String[] strArray = { "hello", "world", "java"

Java - 一道关于Arrays.asList的题目

题目 有这样一道有趣的题目: final int[] test = new int[]{1,2,3,4}; final Integer[] test2 = new Integer[]{1,2,3,4}; final List list1 = Arrays.asList(test); final List list2 = Arrays.asList(test2); final List list3 = Arrays.asList(1,2,3,4); System.out.println(list1