Array in ArrayList umwandeln: Warum das ein ewiger Kopfschmerz für Java-Entwickler ist
\n\nJeder, der schon einmal in Java programmiert hat, kennt die Situation: Sie haben ein fertiges Array String[] oder int[], aber die Aufgabe erfordert ein flexibles ArrayList mit seinen Methoden add(), remove() und dynamischer Größe. Scheinbar eine Kleinigkeit, aber genau diese Frage hat auf Stack Overflow zehntausende Aufrufe und viele Stimmen gesammelt. Warum? Weil es, wie so oft in Java, eine „offensichtliche“ Lösung gibt, die Fallstricke birgt.
In diesem Artikel geben wir nicht einfach nur fertigen Code. Wir gehen alle Methoden zur Erstellung eines ArrayList aus einem Array in Java durch, analysieren ihre Vor- und Nachteile, die Performance und, am wichtigsten, wann welche Variante verwendet werden sollte. Nach der Lektüre können Sie sicher das richtige Werkzeug für Ihre Aufgabe auswählen und vermeiden, im ungünstigsten Moment auf eine UnsupportedOperationException zu stoßen.
Los geht's! (oder wie Java-Entwickler sagen: let's dive into the code)
\n\nMethode 1: Der Klassiker — Arrays.asList()
\n\nDie beliebteste und kürzeste Methode. Sie haben sie sicher schon gesehen:
\n\nString[] fruits = {"apple", "banana", "cherry"};\nList<String> fruitList = Arrays.asList(fruits);\n\nSieht hübsch aus, oder? Aber es gibt einen Haken. Die Methode Arrays.asList() gibt nicht java.util.ArrayList zurück, sondern eine eigene interne statische Version — java.util.Arrays.ArrayList. Dies ist eine Liste fester Größe, die keine Operationen zur Größenänderung unterstützt. Wenn Sie versuchen, fruitList.add("date") auszuführen, erhalten Sie eine UnsupportedOperationException.
Vorteile:
\n- \n
- Äußerst kurzer und lesbarer Code. \n
- Funktioniert als Brücke zwischen Array und Collections-API. \n
- Änderungen in der Liste wirken sich auf das ursprüngliche Array aus (und umgekehrt). \n
Nachteile:
\n- \n
- Feste Größe — es können keine Elemente hinzugefügt oder entfernt werden. \n
- Die zurückgegebene Liste ist ein „Wrapper“ um das Array, kein vollwertiges ArrayList. \n
Wann verwenden: Wenn Sie eine reine Leseliste benötigen oder wenn Sie genau wissen, dass sich die Größe nicht ändern wird. Zum Beispiel zur Übergabe an eine Methode, die List<?> akzeptiert und diese nicht modifiziert.
Wie erhält man ein vollwertiges ArrayList aus Arrays.asList()?
\n\nEinfach das Ergebnis in den Konstruktor einwickeln:
\n\nString[] fruits = {"apple", "banana", "cherry"};\nArrayList<String> fruitList = new ArrayList<>(Arrays.asList(fruits));\nfruitList.add("date"); // Funktioniert jetzt ohne Fehler\n\nDieser Trick ist der goldene Mittelweg. Sie nutzen die kurze Schreibweise von Arrays.asList, erhalten aber eine vollwertige dynamische Sammlung.
Methode 2: Collections.addAll() — Geschwindigkeit und Kontrolle
\n\nWenn Sie auf Performance achten oder einfach eine doppelte Kopie vermeiden möchten (zuerst in eine Liste fester Größe, dann in ein ArrayList), gibt es die Methode Collections.addAll():
String[] fruits = {"apple", "banana", "cherry"};\nArrayList<String> fruitList = new ArrayList<>(fruits.length);\nCollections.addAll(fruitList, fruits);\n\nWas passiert hier? Wir erstellen sofort ein ArrayList mit der benötigten Anfangsgröße (um unnötige Neustrukturierungen des internen Arrays zu vermeiden) und kopieren dann in einem Durchlauf alle Elemente. Die Methode addAll arbeitet schneller als eine for-Schleife, da sie auf niedriger Ebene System.arraycopy() aufruft.
Vorteile:
\n- \n
- Hohe Geschwindigkeit — nahezu auf dem Niveau direkter Speicherkopie. \n
- Sofort ein vollwertiges ArrayList mit Änderungsmöglichkeiten. \n
- Die Kapazität der Liste kann im Voraus festgelegt werden. \n
Nachteile:
\n- \n
- Der Code ist etwas