Listen in Kotlin klonen: Tiefe vs. flache Kopie

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Listen in Kotlin klonen: Wie vermeidet man Ärger mit Referenzen?

\n\n

Stellen Sie sich vor: Sie schreiben eine App in Kotlin, verarbeiten eine Liste von Daten, und plötzlich ändert sich das ursprüngliche Array von selbst. Ein bekanntes Problem? Höchstwahrscheinlich haben Sie nur eine Referenz kopiert, nicht die Liste selbst. In diesem Artikel analysieren wir alle legalen Methoden, um eine Liste in Kotlin zu klonen – von der flachen bis zur tiefen Kopie. Ohne überflüssige Worte, nur Code und Erklärungen.

\n\n

Das Thema wurde durch eine beliebte Frage auf Stack Overflow (über 200.000 Aufrufe) inspiriert: "How to clone or copy a list in kotlin". Lassen Sie uns ein für alle Mal klären, wie man eine Kotlin-Liste richtig kopiert, um Datenverlust und Verwirrung zu vermeiden.

\n\n

Warum funktioniert eine einfache Zuweisung nicht?

\n\n

In Kotlin, wie auch in Java, sind Listen Referenztypen. Wenn Sie schreiben:

\n\n
val original = mutableListOf("A", "B", "C")\nval copy = original  // Das ist KEINE Kopie!\ncopy.add("D")\nprintln(original) // [A, B, C, D] – das Original wurde geändert!
\n\n

Sie haben lediglich einen zweiten Verweis auf dasselbe Objekt im Speicher erstellt. Jede Änderung über copy wirkt sich auf original aus. Um dies zu vermeiden, müssen Sie spezielle Methoden zum Kopieren einer Kotlin-Liste verwenden.

\n\n

Top-5-Methoden zum Kopieren einer Liste in Kotlin

\n\n

Wir betrachten alle wichtigen Varianten: von der einfachen toList()-Methode bis zur manuellen tiefen Kopie. Wählen Sie die passende für Ihre Aufgabe.

\n\n

1. toList() – die einfachste Methode

\n\n

Die Methode toList() erstellt eine neue, unveränderliche Kopie der Liste. Dies ist eine flache Kopie (shallow copy) – die Elemente selbst werden nicht dupliziert, aber die Listenstruktur wird unabhängig.

\n\n
val original = listOf("Kotlin", "Java", "Python")\nval copy = original.toList()\n\n// copy ist ein neues Objekt\nprintln(copy === original) // false – unterschiedliche Referenzen\nprintln(copy == original)  // true – gleicher Inhalt
\n\n

Ideal für einfache Listen mit Strings oder Zahlen. Wenn Sie eine veränderbare Kopie benötigen, verwenden Sie toMutableList().

\n\n

2. toMutableList() – für veränderbare Kopien

\n\n

Möchten Sie eine Kopie, die Sie ändern können? toMutableList() ist Ihre Wahl. Es erstellt eine neue MutableList mit denselben Elementen.

\n\n
val original = listOf(1, 2, 3)\nval mutableCopy = original.toMutableList()\nmutableCopy.add(4)\n\nprintln(original)       // [1, 2, 3]\nprintln(mutableCopy)    // [1, 2, 3, 4] – das Original bleibt unberührt
\n\n

Dies ist die beliebteste Methode, um eine mutable list in Kotlin zu klonen.

\n\n

3. ArrayList(collection) – der Java-Klassiker

\n\n

Wenn Sie aus Java kommen, wird Ihnen diese Methode vertraut vorkommen. Der Konstruktor ArrayList akzeptiert eine andere Sammlung und kopiert deren Elemente.

\n\n
val original = listOf("A", "B", "C")\nval arrayCopy = ArrayList(original)\narrayCopy[0] = "Z"\n\nprintln(original)    // [A, B, C]\nprintln(arrayCopy)   // [Z, B, C]
\n\n

Funktioniert schnell und vorhersagbar. Aber denken Sie daran: Auch dies ist eine shallow copy.

\n\n

4. map() – mit Transformation der Elemente

\n\n

Wenn Sie die Liste nicht nur kopieren, sondern auch die Elemente transformieren möchten, verwenden Sie map(). Es erstellt eine neue Liste basierend auf der alten, indem es auf jedes Element ein Lambda anwendet.

\n\n
val numbers = listOf(10, 20, 30)\nval doubled = numbers.map { it * 2 }\n\nprintln(numbers)  // [10, 20, 30]\nprintln(doubled)  // [20, 40, 60]
\n\n

Für eine einfache Kopie ohne Änderungen können Sie numbers.map { it } schreiben, aber das ist überflüssig – verwenden Sie besser toList().

\n\n

5. Tiefes Kopieren (deep copy) für komplexe Objekte

\n\n

Alle vorherigen Methoden führen eine flache Kopie durch. Wenn Ihre Liste veränderbare Objekte enthält (z. B. eine data class mit Feldern), wirkt sich eine Änderung des Objekts in der Kopie auf das Original aus:

Blogs

Buchempfehlungen