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 = ???;
Unter Java 9 können Sie verwenden List.of
statische Fabrikmethode, um eine List
buchstäblich. Etwas wie das Folgende:
List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));
Dies würde eine unveränderlich Liste mit drei Elementen. Wenn Sie eine änderbar Liste, übergeben Sie diese Liste an die ArrayList
Konstrukteur:
new ArrayList<>(List.of(// elements vararg))
GEP 269 bietet einige komfortable Fabrikmethoden für Java-Sammlungen API. Diese unveränderlichen statischen Fabrikmethoden sind in die List
, Set
y Map
Schnittstellen in Java 9 und höher.
Das wird durch die ursprüngliche Eingabe Array gesichert werden, weshalb Sie (wahrscheinlich) wollen es in einem neuen ArrayList wrap.
Seien Sie vorsichtig mit dieser Lösung. Wenn Sie schauen, Arrays ISN'T Rückgabe eine echte java.util.ArrayList. Es gibt eine innere Klasse zurück, die die erforderlichen Methoden implementiert, aber Sie können die Memebers in der Liste nicht ändern. Es ist lediglich ein Wrapper um ein Array.
Ein weiteres Update, fast bis zum Ende des Jahres 2014, man kann es auch mit Java 8 machen:
ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));
Ein paar Zeichen würden eingespart, wenn es sich nur um eine List
List<Element> list = Stream.of(myArray).collect(Collectors.toList());
Es ist wahrscheinlich am besten, nicht von der Umsetzung abhängig zu sein, aber Collectors.toList()
gibt tatsächlich eine ArrayList
.
Falsche Verwendung von Stream.of(...); dadurch wird ein Ein-Element-Stream erzeugt. Verwenden Sie stattdessen Arrays.stream
Ich glaube nicht, die 2 Optionen sind gültig, aber die Arrays.stream ist etwas "besser", da Sie es mit fester Größe erstellen können, mit der Overload-Methode mit "Start", "Ende" args. Siehe auch: stackoverflow.com/a/27888447/2619091
Wenn Sie :
new ArrayList<T>(Arrays.asList(myArray));
vous Mai erstellen. und füllen zwei Listen! Das doppelte Ausfüllen einer großen Liste ist genau das, was Sie nicht tun wollen, denn dadurch wird eine weitere Object[]
Array, wenn die Kapazität erweitert werden muss.
Glücklicherweise ist die JDK-Implementierung schnell und Arrays.asList(a[])
ist sehr gut gemacht. Es wird eine Art ArrayList mit dem Namen Arrays.ArrayList erstellt, wobei die Object[]-Daten direkt auf das Array zeigen.
// in Arrays
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
//still in Arrays, creating a private unseen class
private static class ArrayList<E>
private final E[] a;
ArrayList(E[] array) {
a = array; // you point to the previous array
}
....
}
Das Gefährliche daran ist, dass wenn Sie das ursprüngliche Array ändern, ändern Sie die Liste! Sind Sie sicher, dass Sie das wollen? Vielleicht ja, vielleicht nicht.
Wenn nicht, ist es am verständlichsten, dies zu tun:
ArrayList<Element> list = new ArrayList<Element>(myArray.length); // you know the initial capacity
for (Element element : myArray) {
list.add(element);
}
Oder wie @glglgl sagte, können Sie eine weitere unabhängige ArrayList mit :
new ArrayList<T>(Arrays.asList(myArray));
Ich verwende gerne Collections
, Arrays
oder Guave. Aber wenn es nicht passt, oder du dich nicht wohl fühlst, schreibe stattdessen einfach eine andere unelegante Zeile.
Ich erkenne nicht den grundlegenden Unterschied zwischen Ihrer Schleife am Ende der Antwort und der new ArrayList<T>(Arrays.asList(myArray));
Teil, von dem Sie abraten, zu verwenden. Beide tun ziemlich das Gleiche und haben die gleiche Komplexität.
Mit Collections wird ein Zeiger auf den Anfang des Arrays erstellt. Meine Schleife erzeugt viele Zeiger: einen für jedes Array-Mitglied. Wenn sich also das ursprüngliche Array ändert, sind meine Zeiger immer noch auf die früheren Werte gerichtet.
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