2013-08-22 14 views
20

Nie możemy wykonać operacji <Collection>.add lub <Collection>.addAll na kolekcjach, które uzyskaliśmy od Arrays.asList .. dozwolona jest tylko operacja usunięcia.Jak dodawać elementy na liście, gdy jest używany Arrays.asList()

A co, jeśli natknę się na scenariusz, w którym muszę dodać nowy element w List, nie usuwając poprzednich elementów z List? Jak mogę to osiągnąć?

+0

Dlaczego nie możesz dodać? 'asList' zwraca' nową tablicę ArrayList'. Och, to nie to samo Lista "ArrayList" –

+4

@SotiriosDelimanolis zwrócona przez Arrays.asList jest wspierana przez tablicę przekazaną i nie można jej modyfikować. Z [dokumentacji] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList (T ...)) (dodano podkreślenia), "Zwraca a ** * lista o stałym rozmiarze *** wspierana przez określoną tablicę. (Zmiany na zwróconej liście "zapisz" do tablicy.) Ta metoda działa jako pomost między interfejsami API opartymi na tablicach i kolekcjami, w połączeniu z Collection.toArray Zwróconą listę można serializować i implementuje RandomAccess. " –

+0

@JoshuaTaylor Nie zauważyłem, że był to 'java.util.Arrays.ArrayList' –

Odpowiedz

40

Utwórz nowy ArrayList za pomocą konstruktora:

List<String> list = new ArrayList<String>(Arrays.asList("a", "b")); 
11

Jednym ze sposobów jest budowa nowej ArrayList:

List<T> list = new ArrayList<T>(Arrays.asList(...)); 

Uczyniwszy które można modyfikować list jak należy.

2

Arrays.asList() generuje listę, która jest faktycznie wsparte przez zespół i jest tablicą, który przekształcił się w formie listy. Możesz użyć go jako listy, ale nie możesz wykonywać na nim pewnych operacji, takich jak dodawanie nowych elementów. Tak więc najlepszym rozwiązaniem jest, aby przekazać je do konstruktora innego listy obj jak ten:

List<T> list = new ArrayList<T>(Arrays.asList(...)); 
1

można dostać wokół pośredniego ArrayList z Java8 strumieni:

Integer[] array = {1, 2, 3}; 
    List<Integer> list = Streams.concat(Arrays.stream(array), 
             Stream.of(4)).collect(Collectors.toList()); 

ten powinien być dość skuteczne, jak to może po prostu dokonać iteracji po tablicy, a także wstępnie przydzielić listę docelową. Może on, ale nie musi, być lepszy dla dużych tablic. Jak zawsze, jeśli to ma znaczenie, musisz zmierzyć.

Powiązane problemy