4097 Stimmen

ArrayList aus Array erstellen

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 = ???;

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"));

114voto

Ali Dehghani Punkte 42660

Java 9

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))

JEP 269: Bequeme Fabrikmethoden für Sammlungen

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.

1 Stimmen

List.of() wird keine Instanz von java.util.ArrayList zurückgeben, wie in der ursprünglichen Frage gefordert. Daher ist nur die zweite Option eine gültige Antwort.

114voto

Peter Tseng Punkte 12727

Eine andere Möglichkeit (die allerdings im Wesentlichen der new ArrayList(Arrays.asList(array)) Lösung in Bezug auf die Leistung:

Collections.addAll(arraylist, array);

94voto

Kip Punkte 102702

Wahrscheinlich brauchen Sie nur eine Liste, nicht eine ArrayList. In diesem Fall können Sie einfach tun:

List<Element> arraylist = Arrays.asList(array);

8 Stimmen

Das wird durch die ursprüngliche Eingabe Array gesichert werden, weshalb Sie (wahrscheinlich) wollen es in einem neuen ArrayList wrap.

17 Stimmen

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.

1 Stimmen

Sie können das Element List<Element> in ein ArrayList<Element> umwandeln

78voto

yamilmedina Punkte 3145

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());

10 Stimmen

Es ist wahrscheinlich am besten, nicht von der Umsetzung abhängig zu sein, aber Collectors.toList() gibt tatsächlich eine ArrayList .

0 Stimmen

Falsche Verwendung von Stream.of(...); dadurch wird ein Ein-Element-Stream erzeugt. Verwenden Sie stattdessen Arrays.stream

0 Stimmen

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

49voto

Nicolas Zozol Punkte 6855

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.

1 Stimmen

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.

0 Stimmen

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.

1 Stimmen

new ArrayList<T>(Arrays.asList(myArray)); tut dasselbe, es kopiert die asList zu einer ArrayList ...

CodeJaeger.com

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.

Powered by:

X