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和remove的时候,会发现会抛出UnsupportedOperationException,为什么?这个不科学呀!
进入Arrays的源代码才发现...尼玛这坑人...

1. Arrays.asList方法中返回的是List<>,但是实际上它继承的是AbstractList<>
2. AbstractList<>继承自AbstractCollection<>和List<>
3. Arrays.asList之后出来的List<>是无法操作add和remove的,会抛出UnsupportedOperationException异常

Arrays.asList中返回的ArrayList<>定义:

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
{
    ...
}

AbstractList的定义:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    ...
}

那下面在来看一下ArrayList<E>中add和remove方法的实现吧,搜索了一下,没有找到add和remove方法!
好吧,那我去AbstractList里找,搜了一下,找到了add方法的定义:

public boolean add(E e) {
    add(size(), e);
    return true;
}

好吧,那继续F3查找add(int index, E element)的定义:

public void add(int index, E element) {
    throw new UnsupportedOperationException();
}

看到了什么?坑爹吧就!
再看看remove方法:

public E remove(int index) {
    throw new UnsupportedOperationException();
}

好吧,一排排的黑线啊...
终于找到原因了,那怎么处理呢?

解决方案:

需要用ArrayList处理一下:

Long[] idLongArrs = {1L, 2L, 3L};
ArrayList<Long> ids = new ArrayList<Long>(Arrays.asList(idLongArrs));
时间: 2024-11-01 14:25:35

Java之Arrays.asList陷阱的相关文章

【转】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快速创建List集合

程序中某段案例代码如下: Map<String, List<CronTrigger>> tMap = new HashMap<String, List<CronTrigger>>(); tMap.put(name, Arrays.asList(new CronTrigger[] { trigger })); 程序运行抛出异常:java.lang.UnsupportedOperationException 错误原因: 为了快速创建List而使用了Arrays.

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

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) 返回

关于Arrays.asList 函数的一些 陷阱

博客分类: JAVA相关 居然也碰到这个陷阱的问题了,查了下书,终于解决,大概讲解如下, 代码如下: Java代码 public static void main(String[] args) { int[] data = {1,2,3,4,5}; List list = Arrays.asList(data); System.out.println("列表中的元素数量是:" + list.size()); } public static void main(String[] args

【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不能用add和remove方法?

在平时的开发过程中,我们知道可以将一个Array的对象转化为List.这样的操作,我们只要采用Arrays.asList这个方法就行了.笔者前段时间一直用这个方法,有一天,我发现通过Arrays.asList得到的List无法进行add和remove等操作. 下面是一段很简单的测试代码: public class MainFacade { public static void main(String[] args) { List<Integer> list = Arrays.asList(1,

java Arrays.asList的用法

import java.util.Arrays; import java.util.List; /** * * 本类演示了Arrays类中的asList方法 * 通过四个段落来演示,体现出了该方法的相关特性. * * (1) 该方法对于基本数据类型的数组支持并不好,当数组是基本数据类型时不建议使用 * (2) 当使用asList()方法时,数组就和列表链接在一起了. *     当更新其中之一时,另一个将自动获得更新. *     注意:仅仅针对对象数组类型,基本数据类型数组不具备该特性 * (