Ich habe ein Array, das wie initialisiert wird:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Ich möchte dieses Array in ein Objekt des Typs ArrayList
Klasse.
ArrayList<Element> arraylist = ???;
Ich habe ein Array, das wie initialisiert wird:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Ich möchte dieses Array in ein Objekt des Typs ArrayList
Klasse.
ArrayList<Element> arraylist = ???;
Jepp. Und in dem (häufigsten) Fall, in dem Sie nur eine Liste wollen, ist die new ArrayList
Anruf ist ebenfalls nicht notwendig.
@Calum und @Pool - wie unten in der Antwort von Alex Miller erwähnt, ist die Verwendung von Arrays.asList(array)
ohne sie in eine neue ArrayList
Objekt wird die Größe der Liste festgelegt. Einer der häufigeren Gründe für die Verwendung eines ArrayList
soll seine Größe dynamisch ändern können, und Ihr Vorschlag würde dies verhindern.
Gegeben:
Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };
Die einfachste Antwort ist zu tun:
List<Element> list = Arrays.asList(array);
Das wird gut funktionieren. Aber einige Vorbehalte:
ArrayList
. Andernfalls erhalten Sie eine UnsupportedOperationException
.asList()
wird durch das ursprüngliche Array unterstützt. Wenn Sie das ursprüngliche Array ändern, wird auch die Liste geändert. Dies mag überraschend sein.(alter Thread, aber nur 2 Cents, da keiner Guava oder andere Libs und einige andere Details erwähnt)
Es lohnt sich, auf die Guava-Methode hinzuweisen, die diesen Blödsinn erheblich vereinfacht:
Verwenden Sie die ImmutableList
Klasse und ihre of()
y copyOf()
Fabrikmethoden (Elemente können nicht null sein) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
Verwenden Sie die Lists
Klasse und ihre newArrayList()
Fabrikmethoden:
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
Bitte beachten Sie auch die ähnlichen Methoden für andere Datenstrukturen in anderen Klassen, zum Beispiel in Sets
.
Die Hauptattraktion könnte darin bestehen, die Unübersichtlichkeit aufgrund von Generika für die Typsicherheit zu verringern, da die Verwendung des Guava Fabrikmethoden lassen sich die Typen in den meisten Fällen ableiten. Dieses Argument ist jedoch weniger stichhaltig, seit Java 7 mit dem neuen Diamant-Operator ausgestattet ist.
Aber das ist nicht der einzige Grund (und Java 7 ist noch nicht überall angekommen): die Kurzsyntax ist auch sehr praktisch, und die Methodeninitialisierer, wie oben gesehen, erlauben es, ausdrucksvolleren Code zu schreiben. Sie tun in einem Guava-Aufruf, was mit den aktuellen Java Collections 2 dauert.
Verwenden Sie die JDK-Funktion Arrays
Klasse und ihre asList()
Factory-Methode, umhüllt von einer Collections.unmodifiableList()
:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Beachten Sie, dass der zurückgegebene Typ für asList()
ist eine List
mit einer konkreten ArrayList
Umsetzung, sondern es ist NICHT java.util.ArrayList
. Es handelt sich um einen inneren Typ, der eine ArrayList
sondern verweist direkt auf das übergebene Array und macht es "durchschreibbar" (Änderungen werden in das Array übernommen).
Sie verbietet Änderungen durch einige der List
API-Methoden durch die einfache Erweiterung einer AbstractList
(das Hinzufügen oder Entfernen von Elementen wird also nicht unterstützt), aber es erlaubt Aufrufe an set()
um Elemente außer Kraft zu setzen. Daher ist diese Liste nicht wirklich unveränderlich und ein Aufruf von asList()
sollte umhüllt sein mit Collections.unmodifiableList()
.
Siehe den nächsten Schritt, wenn Sie eine veränderbare Liste benötigen.
Dasselbe wie oben, aber mit einer tatsächlichen java.util.ArrayList
:
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}
+1 Beachten Sie jedoch, dass die List
zurückgegeben von Arrays.asList
ist insofern veränderlich, als dass Sie noch set
Elemente - es ist nur nicht in der Größe veränderbar. Für unveränderliche Listen ohne Guava können Sie erwähnen Collections.unmodifiableList
.
Da diese Frage schon ziemlich alt ist, überrascht es mich, dass noch niemand die einfachste Form vorgeschlagen hat:
List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));
Ab Java 5, Arrays.asList()
nimmt einen varargs-Parameter und Sie müssen das Array nicht explizit konstruieren.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
59 Stimmen
In Java9 --> List<String> list = List.of("Hallo", "Welt", "von", "Java");
32 Stimmen
@MarekM Diese Antwort ist falsch, denn sie gibt keine
ArrayList
. Das Poster hat ausdrücklich darum gebeten.7 Stimmen
Ich denke, dass er die Listenschnittstelle nicht verwendet hat, weil dies die beste Praxis ist. Aber wenn Sie wollen, hier ist - neue ArrayList<>(List.of("Hallo", "World", "von", "Java"));
22 Stimmen
Es geht nicht um die Verwendung der Schnittstelle, sondern darum, dass in Ihrer Lösung die zurückgegebene Liste nicht veränderbar ist. Das könnte eher ein Problem sein, und ein Grund, warum er nach einer ArrayList fragte