Ich habe ein Array, das ich in ein Array verwandeln möchte List
, um den Inhalt des Arrays zu ändern.
Stack - Überlauf hat viele Fragen / Antworten , die Adresse Arrays.asList()
und wie es nur eine Listenansicht des zugrunde liegenden Array bietet, und wie versucht wird, die sich ergebende Liste zu manipulieren , wird in der Regel ein Wurf UnsupportedOperationException
als Methoden verwendet , um die Liste zu bearbeiten (zB add()
, remove()
usw.) nicht implementiert durch die List-Implementierung bereitgestellt von Arrays.asList()
.
Ich kann jedoch kein Beispiel dafür finden, wie ein Array in eine veränderbare Liste umgewandelt werden kann. Ich nehme an, ich kann das Array und put()
jeden Wert in einer neuen Liste durchlaufen , aber ich frage mich, ob es eine Schnittstelle gibt, die dies für mich erledigt.
Und wenn Sie Google Collection-APIs verwenden
quelle
new ArrayList<>(Arrays.asList(...))
- das Javadoc für die Methode impliziert, dass es veraltet ist, weil es nicht nützlich genug ist.Dieser einfache Code unter Verwendung der in Java 8 enthaltenen Stream-API erstellt eine veränderbare Liste (oder Ansicht), die die Elemente Ihres Arrays enthält:
Foo[] array = ...; List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
Oder ebenso gültig:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
quelle
Wenn Sie Eclipse-Sammlungen (früher GS-Sammlungen ) verwenden, können Sie
FastList.newListWith(...)
oder verwendenFastList.wrapCopy(...)
.Beide Methoden verwenden varargs, sodass Sie das Array inline erstellen oder ein vorhandenes Array übergeben können.
MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4); Integer[] array2 = {1, 2, 3, 4}; MutableList<Integer> list2 = FastList.newListWith(array2);
Der Unterschied zwischen den beiden Methoden besteht darin, ob das Array kopiert wird oder nicht.
newListWith()
kopiert das Array nicht und benötigt daher konstante Zeit. Sie sollten es vermeiden, wenn Sie wissen, dass das Array an anderer Stelle mutiert sein könnte.Integer[] array2 = {1, 2, 3, 4}; MutableList<Integer> list2 = FastList.newListWith(array2); array2[1] = 5; Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2); Integer[] array3 = {1, 2, 3, 4}; MutableList<Integer> list3 = FastList.wrapCopy(array3); array3[1] = 5; Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);
Hinweis: Ich bin ein Committer für Eclipse-Sammlungen.
quelle
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));
quelle
myNewArrayList = new ArrayList(...)
den Rohtyp verwendete? Es gibt einen Unterschied zwischen "Verwenden des Diamantoperators, damit der Compiler ein Typargument ausarbeiten kann" und "Verwenden eines Rohtyps".Hinzufügen einer weiteren Option mithilfe der Streams-API:
quelle