7

为什么在将值分配给 Arrays.asList 后我无法将元素添加到列表

List<Integer> sam = Arrays.asList(1,2,3,4);
sam.add(5);

for (Integer integer : sam)
{
  System.out.println(integer);
}
4

5 回答 5

17

Arrays.asList(1,2,3,4)在一个大小不能改变的数组上创建一个“列表视图”。这样我们就可以通过接口使用和访问数组List

如果您想要一个可以添加值但仍然使用方便的列表Arrays.asList(..),只需执行以下操作:

List<Integer> sam = new ArrayList<>(Arrays.asList(1,2,3,4));
于 2013-07-09T11:00:07.383 回答
6

Arrays.asList返回一个固定大小的列表。不允许从此列表中添加或删除元素,但是可以使用该set方法修改此列表中的元素。

public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a); // this is not java.util.ArrayList
}

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable {
    ArrayList(E[] array) {
        if (array==null)
            throw new NullPointerException();
        a = array;
    }

    public E set(int index, E element) { 
        E oldValue = a[index];
        a[index] = element;
        return oldValue;            
    }

    // add() and remove() methods are inherited from AbstractList
}

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

    public E remove(int index) {
        throw new UnsupportedOperationException();
    }
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
}
于 2013-07-09T11:00:03.213 回答
2

根据文档

返回由指定数组支持的固定大小的列表。(更改返回的列表“直写”到数组。)此方法与 Collection.toArray() 结合,充当基于数组的 API 和基于集合的 API 之间的桥梁。返回的列表是可序列化的并实现了 RandomAccess。

因此,在您创建之后,您无法在其中添加元素。

于 2013-07-09T11:01:13.123 回答
0

查看该方法的文档:

http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T...)

Arrays.asList 方法返回一个固定大小的列表视图,因此您不能使用列表添加元素。

无论如何,这里回答了同样的问题:

Arrays.asList() 有疑问吗?

于 2013-07-09T11:11:35.797 回答
0

asList(T... a)返回由指定数组支持的固定大小的列表。

List<Integer> sam = new ArrayList<Integer>();
sam.addAll(Arrays.asList(1,2,3,4));
sam.add(5);

for (Integer integer : sam)
{
  System.out.println(integer);
}
于 2013-07-09T11:03:10.557 回答