Kotlin: List vs Array — ¿cuál es el truco?
\n\nSi llevas al menos una semana programando en Kotlin, seguramente te has topado con la pregunta: «¿Por qué no puedo usar simplemente Array en todas partes? ¿Para qué necesito List y MutableList?»
Esta pregunta es una de las más populares en Stack Overflow. Y con razón. A simple vista, tanto la lista como el array almacenan elementos, se puede acceder a ellos por índice y se pueden recorrer. Pero si profundizas, descubrirás diferencias fundamentales que afectan el rendimiento, la seguridad del código e incluso la forma en que piensas al diseñar la arquitectura.
\n\nEn este tutorial, desglosaremos a fondo la diferencia entre List y Array en Kotlin. Aprenderás cuándo usar un array y cuándo una lista, y por qué los desarrolladores experimentados casi siempre eligen List.
1. Conceptos básicos: ¿qué es Array en Kotlin?
\n\nArray en Kotlin es una proyección directa del array de Java. Es una secuencia fija de elementos del mismo tipo. Cuando creas un array, reservas memoria para él de inmediato. No se puede cambiar el tamaño del array después de crearlo.
// Creación de un array\nval numbers: Array<Int> = arrayOf(1, 2, 3, 4, 5)\nprintln(numbers[0]) // 1\nnumbers[2] = 10 // se puede cambiar el valor\nprintln(numbers[2]) // 10\n\nLos arrays en Kotlin son mutables por naturaleza: siempre puedes reemplazar un elemento por índice. Pero no puedes agregar un nuevo elemento ni eliminar uno existente. El tamaño queda fijado para siempre.
\n\nCaracterísticas de Array:
\n- \n
- Tamaño fijo — no se puede agregar ni eliminar un elemento. \n
- Contenido mutable — se pueden sobrescribir los elementos. \n
- Rendimiento — máximo, ya que es acceso directo a la memoria. \n
- Arrays primitivos — existen tipos especiales:
IntArray,ByteArray,FloatArray, etc. Funcionan sin boxing, lo que proporciona un aumento de velocidad. \n
// Array primitivo — sin boxing\nval intArray: IntArray = intArrayOf(1, 2, 3, 4, 5)\n\n2. Conceptos básicos: ¿qué es List en Kotlin?
\n\nList es una interfaz de la biblioteca estándar de Kotlin. A diferencia del array, una lista es una abstracción. No sabes exactamente cómo almacena los datos internamente (puede ser un ArrayList, un LinkedList o algo más).
// Creación de una lista inmutable\nval fruits: List<String> = listOf("apple", "banana", "cherry")\nprintln(fruits[0]) // apple\n// fruits[0] = "orange" // ¡Error de compilación!\n\nLa principal «característica» de Kotlin es la división entre solo lectura (List) y mutable (MutableList).
List (solo lectura):
\n- \n
- No se puede modificar el contenido (ni agregar, ni eliminar, ni reemplazar). \n
- Solo se puede leer. \n
- Más seguro para transferir datos entre componentes. \n
MutableList:
\n- \n
- Se pueden agregar, eliminar y reemplazar elementos. \n
- Tamaño dinámico. \n
- En la práctica, la mayoría de las veces se usa
ArrayListinternamente. \n
val mutableFruits: MutableList<String> = mutableListOf("apple", "banana")\nmutableFruits.add("orange") // OK\nmutableFruits.remove("banana") // OK\nmutableFruits[0] = "pear" // OK\n\n3. Diferencias clave entre List y Array
\n\nResumamos todo en una tabla visual (en el código, como comentarios).
\n\n// 1. Mutabilidad\nval array = arrayOf(1, 2, 3)\narray[0] = 99 // ✅ Funciona\n\nval list = listOf(1, 2, 3)\n// list[0] = 99 // ❌ Error de compilación\n\nval mutableList = mutableListOf(1, 2, 3)\nmutableList[0] = 99 // ✅ Funciona\n\n// 2. Tamaño\nval fixedArray = arrayOf(1, 2, 3)\n// fixedArray.add(4) // ❌ No existe ese método\n\nva