Ich habe ein Array, das wie folgt initialisiert wird:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Ich möchte dieses Array in ein Objekt der ArrayList
Klasse konvertieren .
ArrayList<Element> arraylist = ???;
java
arrays
arraylist
type-conversion
Ron Tuffin
quelle
quelle
ArrayList
. Das Poster hat speziell danach gefragt.Antworten:
quelle
new ArrayList
Anruf ebenfalls nicht erforderlich.List<ClassName> list = Arrays.asList(array)
Arrays.asList(array)
ohne sie an ein neuesArrayList
Objekt zu übergeben. Einer der häufigsten Gründe für die Verwendung von aArrayList
ist die dynamische Änderung seiner Größe. Ihr Vorschlag würde dies verhindern.Gegeben:
Die einfachste Antwort lautet:
Dies wird gut funktionieren. Aber einige Einschränkungen:
ArrayList
. Andernfalls erhalten Sie eineUnsupportedOperationException
.asList()
zurückgegebene Liste wird vom ursprünglichen Array unterstützt. Wenn Sie das ursprüngliche Array ändern, wird auch die Liste geändert. Dies kann überraschend sein.quelle
java.util.ArrayList
. Arrays.asList gibt tatsächlich eine zurück,java.util.Arrays.ArrayList
die keineinstanceof
andere Klasse ist. Eine dritte Einschränkung ist also, dass es nicht funktioniert, wenn Sie versuchen, es in einem Kontext zu verwenden, der dies erfordert.(alter Thread, aber nur 2 Cent, da keiner Guava oder andere Bibliotheken und einige andere Details erwähnt)
Wenn Sie können, verwenden Sie Guave
Es lohnt sich, auf den Guaven-Weg hinzuweisen, der diese Spielereien erheblich vereinfacht:
Verwendungszweck
Für eine unveränderliche Liste
Verwenden Sie die
ImmutableList
Klasse und ihreof()
undcopyOf()
Factory-Methoden (Elemente dürfen nicht null sein) :Für eine veränderbare Liste
Verwenden Sie die
Lists
Klasse und ihrenewArrayList()
Factory-Methoden:Bitte beachten Sie auch die ähnlichen Methoden für andere Datenstrukturen in anderen Klassen, zum Beispiel in
Sets
.Warum Guave?
Die Hauptattraktion könnte darin bestehen, die Unordnung aufgrund von Generika für die Typensicherheit zu verringern, da durch die Verwendung der Guava- Fabrikmethoden die Typen die meiste Zeit abgeleitet werden können. Dieses Argument enthält jedoch weniger Wasser, da Java 7 mit dem neuen Diamantoperator eingetroffen ist.
Dies ist jedoch nicht der einzige Grund (und Java 7 ist noch nicht überall): Die Kurzschrift-Syntax ist ebenfalls sehr praktisch, und die oben beschriebenen Methodeninitialisierer ermöglichen das Schreiben von aussagekräftigerem Code. Sie tun in einem Guava-Aufruf, was mit den aktuellen Java-Sammlungen 2 dauert.
Wenn Sie nicht können ...
Für eine unveränderliche Liste
Verwenden Sie die
Arrays
Klasse des JDK und seineasList()
Factory-Methode, die mit einemCollections.unmodifiableList()
:Beachten Sie, dass der zurückgegebene Typ für
asList()
eineList
konkrete VerwendungArrayList
Implementierung, aber es ist nichtjava.util.ArrayList
. Es ist ein innerer Typ, der ein emuliertesArrayList
Array emuliert, aber tatsächlich direkt auf das übergebene Array verweist und es zum "Durchschreiben" bringt (Änderungen werden im Array wiedergegeben).Es verbietet Änderungen durch einige der
List
API-Methoden durch einfaches Erweitern von aAbstractList
(daher wird das Hinzufügen oder Entfernen von Elementen nicht unterstützt), ermöglicht jedoch Aufrufen,set()
Elemente zu überschreiben. Daher ist diese Liste nicht wirklich unveränderlich und ein Aufruf anasList()
sollte mit abgeschlossen werdenCollections.unmodifiableList()
.Lesen Sie den nächsten Schritt, wenn Sie eine veränderbare Liste benötigen.
Für eine veränderbare Liste
Wie oben, jedoch mit einem tatsächlichen
java.util.ArrayList
:Für Bildungszwecke: Der gute alte manuelle Weg
quelle
List
zurückgegebene vonArrays.asList
veränderbar ist, da Sie weiterhinset
Elemente verwenden können - es kann nur nicht in der Größe geändert werden. Für unveränderliche Listen ohne Guave könnten Sie erwähnenCollections.unmodifiableList
.arrayToList
alte manuelle Weg ist Ihr für Java 1.5+ falsch. Sie instanziieren Listen vonString
und versuchen, Zeichenfolgen aus dem angegebenen Array abzurufen, anstatt den generischen Parametertyp zu verwendenT
. Davon abgesehen eine gute Antwort und +1 für die einzige, die den manuellen Weg einschließt.O(1)
, aber für Unveränderlichkeit müssen Sie eine Kopie erstellen, zCollections.unmodifiableList(new ArrayList<>(Arrays.asList(array)))
.Da diese Frage ziemlich alt ist, überrascht es mich, dass noch niemand die einfachste Form vorgeschlagen hat:
Ab Java 5 wird
Arrays.asList()
ein varargs-Parameter verwendet, und Sie müssen das Array nicht explizit erstellen.quelle
List<String> a = Arrays.asList("first","second","third")
Stellen Sie sicher, dass dies
myArray
der gleiche Typ ist wieT
. Sie erhalten einen Compilerfehler, wenn Sie beispielsweise versuchen, einenList<Integer>
aus einem Array von zu erstellenint
.quelle
Ein anderer Weg (obwohl er im Wesentlichen der
new ArrayList(Arrays.asList(array))
Leistung der Lösung entspricht :quelle
Java 9
In Java 9 können Sie die
List.of
statische Factory-Methode verwenden, um einList
Literal zu erstellen . So etwas wie das Folgende:Dies würde eine unveränderliche Liste zurückgeben, die drei Elemente enthält. Wenn Sie eine veränderbare Liste wünschen , übergeben Sie diese Liste an den
ArrayList
Konstruktor:JEP 269: Convenience Factory-Methoden für Sammlungen
JEP 269 bietet einige praktische Factory-Methoden für die Java Collections- API. Diese unveränderlichen statischen Factory - Methoden werden in denen gebaut
List
,Set
undMap
Schnittstellen in Java 9 und höher.quelle
Sie benötigen wahrscheinlich nur eine Liste, keine ArrayList. In diesem Fall können Sie einfach Folgendes tun:
quelle
set
Methode) ändern, Sie können die Größe der Liste (nichtadd
oderremove
Elemente) nicht ändern !Ein weiteres Update, das fast das Jahr 2014 beendet, können Sie auch mit Java 8 durchführen:
Ein paar Zeichen würden gespeichert, wenn dies nur ein sein könnte
List
quelle
Collectors.toList()
tatsächlich eine zurückzugebenArrayList
.Wenn du benutzt :
Sie können zwei Listen erstellen und füllen ! Das zweimalige Ausfüllen einer großen Liste ist genau das, was Sie nicht tun möchten, da
Object[]
jedes Mal, wenn die Kapazität erweitert werden muss, ein weiteres Array erstellt wird.Glücklicherweise ist die JDK-Implementierung schnell und
Arrays.asList(a[])
sehr gut gemacht. Es wird eine Art ArrayList mit dem Namen Arrays.ArrayList erstellt, in der die Object [] -Daten direkt auf das Array verweisen.Die gefährliche Seite ist, dass Sie die Liste ändern , wenn Sie das ursprüngliche Array ändern! Bist du sicher, dass du das willst? Vielleicht ja vielleicht nein.
Wenn nicht, ist dies am verständlichsten:
Oder wie gesagt @glglgl, können Sie eine weitere unabhängige ArrayList erstellen mit:
Ich liebe es zu verwenden
Collections
,Arrays
oder Guave. Aber wenn es nicht passt oder Sie es nicht fühlen, schreiben Sie stattdessen einfach eine andere unelegante Zeile.quelle
new ArrayList<T>(Arrays.asList(myArray));
Teil, von dessen Verwendung Sie abraten. Beide machen das gleiche und haben die gleiche Komplexität.new ArrayList<T>(Arrays.asList(myArray));
macht das gleiche, es kopiert dasasList
zu einemArrayList
...In können
Java 9
Sie verwenden:quelle
Entsprechend der Frage lautet die Antwort mit Java 1.7:
Verwenden Sie jedoch besser immer die Schnittstelle:
quelle
quelle
Sie können mit verschiedenen Methoden konvertieren
List<Element> list = Arrays.asList(array);
List<Element> list = new ArrayList();
Collections.addAll(list, array);
Arraylist list = new Arraylist();
list.addAll(Arrays.asList(array));
Weitere Informationen finden Sie unter http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html
quelle
Wie alle sagten, wird dies so sein
und die gebräuchlichste neueste Methode zum Erstellen von Arrays sind beobachtbare Arrays
ObservableList: Eine Liste, mit der Listener Änderungen verfolgen können, wenn sie auftreten.
für Java SE können Sie versuchen
das ist nach Oracle Docs
Aktualisieren Sie Java 9
auch in Java 9 ist es ein bisschen einfach:
quelle
Seit Java 8 gibt es eine einfachere Möglichkeit zur Transformation:
quelle
Sie können dies auch mit Stream in Java 8 tun.
quelle
Collectors.toList()
wird eine RückkehrArrayList
. Dies kann jedoch in zukünftigen Versionen von Java unterschiedlich sein. Wenn Sie einen bestimmten Sammlungstyp möchten, verwenden SieCollectors.toCollection()
stattdessen, wo Sie angeben können, welchen genauen Sammlungstyp Sie erstellen möchten.Wenn wir die Definition der
Arrays.asList()
Methode sehen, erhalten Sie ungefähr Folgendes:Sie können also folgendermaßen initialisieren
arraylist
:Möglicherweise gibt es auch eine andere Antwort auf diese Frage.
Wenn Sie eine Deklaration für die
java.util.Collections.addAll()
Methode sehen, erhalten Sie ungefähr Folgendes:Daher ist dieser Code auch nützlich, um dies zu tun
quelle
Eine andere einfache Möglichkeit besteht darin, alle Elemente aus dem Array mithilfe einer for-each-Schleife zu einer neuen ArrayList hinzuzufügen.
quelle
Wenn das Array vom primitiven Typ ist, funktionieren die angegebenen Antworten nicht. Aber seit Java 8 können Sie verwenden:
quelle
char
Array zu funktionieren .Sie können dies in Java 8 wie folgt tun
quelle
ArrayList<String> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Wir können ein Array leicht in konvertieren
ArrayList
. Wir verwenden dieaddAll()
Methode der Sammlungsschnittstelle , um Inhalte von einer Liste in eine andere zu kopieren.quelle
ArrayList
Konstruktoren akzeptiert ein? extends Collection<T>
Argument und macht den Aufruf vonaddAll
redundant.Obwohl es viele perfekt geschriebene Antworten auf diese Frage gibt, werde ich meine Eingaben hinzufügen.
Sagen Sie, Sie haben
Element[] array = { new Element(1), new Element(2), new Element(3) };
Neue ArrayList kann auf folgende Arten erstellt werden
Und sie unterstützen sehr gut alle Operationen von ArrayList
Die folgenden Vorgänge geben jedoch nur eine Listenansicht einer ArrayList und keine tatsächliche ArrayList zurück.
Daher geben sie Fehler aus, wenn sie versuchen, einige ArrayList-Operationen durchzuführen
Weitere Informationen zur Listendarstellung des Array- Links .
quelle
Der einfachste Weg, dies zu tun, ist das Hinzufügen des folgenden Codes. Ausprobiert und getestet.
quelle
Ausgabe ist ...
Hallo
Welt
quelle
Verwenden Sie den folgenden Code, um ein Elementarray in eine ArrayList zu konvertieren.
quelle
Jeder hat bereits genug gute Antworten auf Ihr Problem gegeben. Aus allen Vorschlägen müssen Sie nun entscheiden, welche Ihren Anforderungen entspricht. Es gibt zwei Arten von Sammlungen, die Sie kennen müssen. Eine ist eine unveränderte Sammlung und eine andere Sammlung, mit der Sie das Objekt später ändern können.
Hier werde ich ein kurzes Beispiel für zwei Anwendungsfälle geben.
Unveränderliche Sammlungserstellung :: Wenn Sie das Sammlungsobjekt nach der Erstellung nicht ändern möchten
List<Element> elementList = Arrays.asList(array)
Erstellung veränderbarer Sammlungen :: Wenn Sie das erstellte Sammlungsobjekt nach der Erstellung ändern möchten.
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
quelle
List
zurückgegebene SammlungArrays.asList
ist nur ein Wrapper über dem ursprünglichen Array und ermöglicht den Zugriff auf und die Änderung einzelner Elemente überget
undset
. Sie sollten wahrscheinlich klarstellen, dass Sie "keine Elemente hinzufügen oder entfernen" anstelle von "unveränderlich" meinen, was bedeutet, dass Sie sich überhaupt nicht ändern.Gegebenes Objektarray:
Array in Liste konvertieren:
Konvertieren Sie Array in ArrayList
Array in LinkedList konvertieren
Liste drucken:
AUSGABE
1
2
3
quelle
Die Arrays-Klasse von Java 8 bietet eine stream () -Methode, bei der Versionen überladen sind, die sowohl primitive Arrays als auch Object-Arrays akzeptieren.
quelle
Der folgende Code scheint eine gute Möglichkeit zu sein, dies zu tun.
quelle