Clonación de listas en Kotlin: ¿cómo no meter la pata con las referencias?
\n\nImagine: está escribiendo una aplicación en Kotlin, procesando una lista de datos, y de repente el array original cambia por sí solo. ¿Le suena familiar? Lo más probable es que simplemente copió la referencia, no la lista en sí. En este artículo analizaremos todas las formas legales de clonar una lista en Kotlin, desde la copia superficial hasta la profunda. Sin rodeos, solo código y explicaciones.
\n\nEl tema está inspirado en una pregunta popular en Stack Overflow (más de 200 000 visitas): "How to clone or copy a list in kotlin". Aclaremos de una vez por todas cómo copiar una lista en Kotlin correctamente, para no perder datos ni volverse loco.
\n\n¿Por qué la simple asignación no funciona?
\n\nEn Kotlin, al igual que en Java, las listas son tipos de referencia. Si escribe:
\n\nval original = mutableListOf("A", "B", "C")\nval copy = original // ¡Esto NO es una copia!\ncopy.add("D")\nprintln(original) // [A, B, C, D] — ¡el original cambió!\n\nSimplemente creó una segunda referencia al mismo objeto en memoria. Cualquier cambio a través de copy se reflejará en original. Para evitarlo, debe usar métodos especiales de copia de listas en Kotlin.
Top 5 formas de copiar una lista en Kotlin
\n\nVeremos todas las opciones principales: desde el simple toList() hasta la copia profunda manual. Elija la que se adapte a su tarea.
1. toList() — la forma más simple
\n\nEl método toList() crea una nueva copia inmutable de la lista. Esto es una copia superficial (shallow copy) — los elementos en sí no se duplican, pero la estructura de la lista se vuelve independiente.
val original = listOf("Kotlin", "Java", "Python")\nval copy = original.toList()\n\n// copy es un nuevo objeto\nprintln(copy === original) // false — diferentes referencias\nprintln(copy == original) // true — mismo contenido\n\nIdeal para listas simples de cadenas o números. Si necesita una copia mutable, use toMutableList().
2. toMutableList() — para copias mutables
\n\n¿Quiere una copia que pueda modificar? toMutableList() es su opción. Crea un nuevo MutableList con los mismos elementos.
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] — el original intacto\n\nEsta es la forma más popular de clonar una mutable list en Kotlin.
\n\n3. ArrayList(collection) — el clásico de Java
\n\nSi viene de Java, este método le resultará familiar. El constructor ArrayList recibe otra colección y copia sus elementos.
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\nFunciona rápido y de forma predecible. Pero recuerde: también es una shallow copy.
\n\n4. map() — con transformación de elementos
\n\nSi no solo necesita copiar, sino también transformar los elementos, use map(). Crea una nueva lista basada en la anterior, aplicando una lambda a cada elemento.
val numbers = listOf(10, 20, 30)\nval doubled = numbers.map { it * 2 }\n\nprintln(numbers) // [10, 20, 30]\nprintln(doubled) // [20, 40, 60]\n\nPara una copia simple sin cambios, puede escribir numbers.map { it }, pero es redundante — es mejor usar toList().
5. Copia profunda (deep copy) para objetos complejos
\n\nTodos los métodos anteriores hacen una copia superficial. Si su lista contiene objetos mutables (por ejemplo, data class con campos), modificar el objeto en la copia afectará al original: