2013-07-09 3 views
6

Почему я не могу добавить элемент в список после присвоения значения от Arrays.asListДобавление элементов в список Java

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

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

http://stackoverflow.com/questions/4792160/arrays-aslist-doubt Это поможет вам понять, что вы делаете , – Mueretee

ответ

11

Arrays.asList(1,2,3,4) создает «представление списка» на массив, размер которого не может измениться. Таким образом, мы можем использовать и получать доступ к массиву через интерфейс List.

Если вы хотите список, в котором вы можете добавить значения, но по-прежнему использовать удобный Arrays.asList(..), просто сделать:

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

Является ли это тем, что, получая просмотр списка, мы можем выполнять такие операции, как мы делаем в списке? –

+0

Да. Все методы из интерфейса «Список» доступны, но некоторые из них имеют ограничения: например, 'add' не будет работать, потому что это все еще массив. –

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

As per docs

Возвращает список фиксированного размера, поддержанный указанным массив. (Изменяется на возвращаемый список «write through» в массив.) Этот метод действует как мост между API-интерфейсами на основе массива и коллекцией в сочетании с Collection.toArray(). Возвращенный список является сериализуемым и реализует RandomAccess.

Итак, после того, как вы создали, вы не можете добавлять в него элементы.

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

Глядя в документации метода:

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

Метод Arrays.asList вернулся фиксированного размера в виде списка, так что вы не можете добавлять элементы, используя список.

Во всяком случае, тот же вопрос ответил здесь:

Arrays.asList() doubt?

Смежные вопросы