Java之Arrays.asList陷阱

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));

你可能感兴趣的:(Java之Arrays.asList陷阱)