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