在Java中向列表添加元素

7

为什么我在把值从Arrays.asList赋给列表后无法添加元素

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

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

1
这将帮助你理解你正在做什么。请参阅:https://dev59.com/4G445IYBdhLWcg3wkLPU - Mueretee
5个回答

17

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

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

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

通过获取列表视图,我们可以执行类似于在列表上执行的操作吗? - Prasad Kharkar
是的。List 接口中的所有方法都可用,但有些方法有限制:例如 add 方法无法使用 - 因为它仍然是一个数组。 - Andreas Dolk

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

2

根据文档

返回由指定数组支持的固定大小的列表。 (对返回的列表所做的更改“写入”到数组中。)此方法充当基于数组和基于集合的API之间的桥梁,与Collection.toArray()结合使用。返回的列表是可序列化的并实现随机访问。

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


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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接