开发中有时候创建的数组但却想使用List的相关方法,为了图个方便,就使用了这种方式,但却可能给自己挖了一个坑。下面具体说说这个问题。
首先查看一下源码,方法代码如下:
/**
* Returns a fixed-size list backed by the specified array.
*/
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
这里的ArrayList可不是平时使用的ArrayList,这里的ArrayList重写的方法如下:
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private final E[] a;
ArrayList(E[] array) {}
@Override
public int size() {}
@Override
public Object[] toArray() {}
@Override
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {}
@Override
public E get(int index) {}
@Override
public E set(int index, E element) {}
@Override
public int indexOf(Object o) {}
@Override
public boolean contains(Object o) {}
@Override
public Spliterator<E> spliterator() {}
@Override
public void forEach(Consumer<? super E> action) {}
@Override
public void replaceAll(UnaryOperator<E> operator) {}
@Override
public void sort(Comparator<? super E> c) {}
@Override
public Iterator<E> iterator() {}
}
AbstractList中的好多方法没有从写,比如说add()方法,
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
使用add()方法是会报错的,所以要慎用Arrays.asList()方法。