Introducción: Por qué esta pregunta atormenta a todos los que pasan de Java a Kotlin
\n\n¿Acabas de empezar a estudiar Kotlin después de Java y ya te has topado con la primera sorpresa? ¿Intentas declarar un array de cadenas como estabas acostumbrado en Java — String[] names = {"Alice", "Bob"} — y el compilador de Kotlin te da un error? Felicidades, no estás solo. La pregunta "What's the Kotlin equivalent of Java's String[]?" ha acumulado miles de visitas en Stack Overflow, y no es casualidad.
Kotlin no es solo "Java con azúcar". Google lo posiciona como un lenguaje más moderno, seguro y conciso. Pero esta concisión a veces confunde a los principiantes. En Java, un array es una construcción integrada del lenguaje. En Kotlin, los arrays son parte de la biblioteca estándar y tienen sus propias particularidades.
\n\nEn este artículo, analizaremos todo lo que necesitas saber sobre los arrays de cadenas en Kotlin. No solo aprenderás el análogo directo de String[], sino también alternativas más flexibles que harán tu código más limpio y seguro. ¡Allá vamos!
1. El análogo directo: Array<String>
\n\nLa forma más simple y obvia de reemplazar String[] en Kotlin es usar Array<String>. En Kotlin, todos los arrays son objetos de la clase Array<T>, donde T es el tipo de los elementos.
¿Cómo declarar e inicializar?
\n\nEn Java escribes:
\nString[] names = new String[3];\nnames[0] = "Alice";\nnames[1] = "Bob";\nnames[2] = "Charlie";\n\nEn Kotlin se ve así:
\nval names: Array<String> = arrayOfNulls(3)\nnames[0] = "Alice"\nnames[1] = "Bob"\nnames[2] = "Charlie"\n\nPero hay una forma mucho más corta: usar la función arrayOf():
val names = arrayOf("Alice", "Bob", "Charlie")\n\nEl compilador de Kotlin deduce automáticamente el tipo Array<String>. Ten en cuenta: a diferencia de Java, en Kotlin no hay operador new para crear arrays. En su lugar, se utilizan funciones de fábrica.
Diferencia importante: tamaño fijo
\n\nAl igual que en Java, el tamaño de Array<String> es fijo. No puedes agregar un nuevo elemento después de la creación. Si intentas acceder a un índice fuera de los límites, obtendrás un ArrayIndexOutOfBoundsException.
val fruits = arrayOf("Apple", "Banana")\n// fruits[2] = "Cherry" // ¡Error! El índice está fuera de los límites\n\n2. Arrays especializados: no siempre Array<String>
\n\nPara tipos primitivos (Int, Double, Boolean), Kotlin ofrece clases optimizadas: IntArray, DoubleArray, BooleanArray, etc. Estas no utilizan autoboxing/unboxing, lo que ahorra memoria y acelera la ejecución.
Pero para cadenas no existe tal optimización, porque String es un tipo de referencia, no un primitivo. Por lo tanto, Array<String> es la única opción si necesitas exactamente un array.
3. Alternativa n.º 1: List<String> (lista inmutable)
\n\nEn la mayoría de los casos, no necesitas un array. En Kotlin se recomienda encarecidamente usar listas en lugar de arrays, a menos que trabajes con código de bajo nivel (por ejemplo, JNI u optimización de rendimiento a nivel de nanosegundos).
\n\nLa lista List<String> es una colección inmutable. No puedes cambiar su tamaño ni sus elementos después de la creación. Esto hace que el código sea más seguro en entornos multiproceso.
val namesList: List<String> = listOf("Alice", "Bob", "Charlie")\n// namesList[0] = "Eve" // ¡Error! listOf devuelve una lista inmutable\n\nEn esencia, listOf es el equivalente de Kotlin para Java String[] con protección adicional. En Java, un array se puede modificar accidentalmente al pasarlo a otro método. En Kotlin, List no lo permite.