2009-10-26 18 views

Odpowiedz

53

Array.asList()okłady tablicy w interfejsie listy. Lista jest nadal wspierana przez tablicę. Tablice mają stały rozmiar - nie obsługują dodawania ani usuwania elementów, więc opakowanie również nie może działać.

Docs nie robią to tak oczywiste, jak mogą one, ale robią powiedzieć:

Zwraca listę stałym rozmiarze poparte określonej tablicy.

„Fixed-size” bit powinien być wskazówką, że nie można dodać lub usunąć elementy :)

Chociaż istnieją inne sposoby obejścia tego (inne sposoby tworzenia nowego ArrayList z tablicy) bez dodatkowych bibliotek, osobiście polecam uzyskanie Google Collections Library (lub Guava, kiedy zostanie wydany). Możesz następnie użyć:

List<Integer> list = Lists.newArrayList(array); 

Powodem, dla którego sugeruję to, jest to, że GCL jest ogólnie rzeczą dobrą i wartą użycia.

Jak wspomniano w komentarzach, zajmuje to egzemplarz tablicy; lista nie jest wspierana przez oryginalną tablicę, a zmiany w obu kolekcjach nie będą widoczne w drugiej.

+1

+1 dla Google Guava – Snekse

+0

Uzgodnione. Jednak myślę, że warto zauważyć, że oryginalna metoda zwraca listę, która jest wspierana przez oryginalną tablicę i zmienia "write-through" na oryginalną tablicę. Użycie tego nie zwróci listy, która jest wspierana przez oryginalną tablicę, a wszelkie zmiany w tej zwróconej liście NIE wpłyną na oryginalną tablicę. – desau

+0

@desau: Edytowałem, aby to zaznaczyć. –

5

Implementacja, którą otrzymasz z asList, nie implementuje pełnego interfejsu List.I przekształciłbym listę w ArrayList, a następnie dokonał na niej modyfikacji.

Zobacz http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#remove%28int%29

+0

Masz na myśli iteracji na tej liście i umieścić wszystkie obiekty ArrayList na początku? –

+0

Nie, konstruktor ArrayList pobiera kolekcję jako argument, więc możesz po prostu wywołać nową ArrayList. –

17

To nie java.util.ArrayList. Arrays.asList() zwraca własną implementację List i nie obsługuje usuwania. Można tworzyć prawdziwe ArrayList od niego:

new java.util.ArrayList(Arrays.asList(someArray)); 

To bardzo mylące jak asList() roboty, muszę przyznać.

0

Ponieważ otrzymujesz listę tylko do odczytu. spróbować

List newList = new ArrayList(myList); 
+4

To nie jest tylko do odczytu - to tylko ustalony rozmiar. –

6

Proszę przeczytać w dokumentacji API dla Arrays.asList():

Zwraca listę stałym rozmiarze poparte określonej tablicy. (Zmiany w zwracanej listy „write through” do tablicy.)

Zauważ, że Collections.remove (int) jest oznaczony w Javadocs jako „opcjonalne pracy”, czyli nie wszystkie zbiory będą go wspierać. "lista o stałym rozmiarze" oznacza, że ​​nie możesz zmienić wielkości listy, którą zrobiłaby funkcja remove(). Więc nie jest obsługiwane.

Jeśli chcesz zmienić listę wygenerowaną przez Arrays.asList(), po prostu skopiuj ją, np. new ArrayList(Arrays.asList(...)).

0

użycie

ArrayList zamiast listy

Lista ustaliła elementu size Lista może ani przedmiot dodawania ani usuń

Powiązane problemy