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

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 に答える