Introduction : Pourquoi cette question tourmente tous ceux qui passent de Java à Kotlin
\n\nVous venez de commencer à apprendre Kotlin après Java et vous avez déjà rencontré votre première surprise ? Vous essayez de déclarer un tableau de chaînes comme vous en aviez l'habitude en Java — String[] names = {"Alice", "Bob"} — et le compilateur Kotlin affiche une erreur ? Félicitations, vous n'êtes pas seul. La question "What's the Kotlin equivalent of Java's String[]?" a recueilli des milliers de vues sur Stack Overflow, et ce n'est pas un hasard.
Kotlin n'est pas simplement « Java avec du sucre ». Google le positionne comme un langage plus moderne, plus sûr et plus concis. Mais cette concision déroute parfois les débutants. En Java, un tableau est une construction intégrée au langage. En Kotlin, les tableaux font partie de la bibliothèque standard et ont leurs propres subtilités.
\n\nDans cet article, nous allons décortiquer tout ce qu'il faut savoir sur les tableaux de chaînes en Kotlin. Vous découvrirez non seulement l'équivalent direct de String[], mais aussi des alternatives plus flexibles qui rendront votre code plus propre et plus sûr. C'est parti !
1. L'équivalent direct : Array<String>
\n\nLa façon la plus simple et la plus évidente de remplacer String[] en Kotlin est d'utiliser Array<String>. En Kotlin, tous les tableaux sont des objets de la classe Array<T>, où T est le type des éléments.
Comment déclarer et initialiser ?
\n\nEn Java, vous écrivez :
\nString[] names = new String[3];\nnames[0] = "Alice";\nnames[1] = "Bob";\nnames[2] = "Charlie";\n\nEn Kotlin, cela ressemble à ceci :
\nval names: Array<String> = arrayOfNulls(3)\nnames[0] = "Alice"\nnames[1] = "Bob"\nnames[2] = "Charlie"\n\nMais il existe une façon bien plus courte : utiliser la fonction arrayOf() :
val names = arrayOf("Alice", "Bob", "Charlie")\n\nLe compilateur Kotlin déduit lui-même le type Array<String>. Notez : contrairement à Java, Kotlin n'utilise pas l'opérateur new pour créer des tableaux. À la place, on utilise des fonctions d'usine.
Différence importante : taille fixe
\n\nComme en Java, la taille de Array<String> est fixe. Vous ne pouvez pas ajouter un nouvel élément après sa création. Si vous tentez d'accéder à un index hors limites, vous obtiendrez une ArrayIndexOutOfBoundsException.
val fruits = arrayOf("Pomme", "Banane")\n// fruits[2] = "Cerise" // Erreur ! Index hors limites\n\n2. Tableaux spécialisés : pas toujours Array<String>
\n\nPour les types primitifs (Int, Double, Boolean), Kotlin propose des classes optimisées : IntArray, DoubleArray, BooleanArray, etc. Elles n'utilisent pas l'auto-boxing/unboxing, ce qui économise de la mémoire et accélère l'exécution.
Mais pour les chaînes, une telle optimisation n'existe pas, car String est un type référence, pas un type primitif. Donc Array<String> est la seule option si vous avez besoin d'un tableau.
3. Alternative n°1 : List<String> (liste immuable)
\n\nDans la plupart des cas, vous n'avez pas besoin d'un tableau. En Kotlin, il est fortement recommandé d'utiliser des listes plutôt que des tableaux, sauf si vous travaillez avec du code bas niveau (par exemple, JNI ou optimisation des performances à l'échelle de la nanoseconde).
\n\nLa liste List<String> est une collection immuable. Vous ne pouvez ni modifier sa taille ni ses éléments après sa création. Cela rend le code plus sûr dans un environnement multithread.
val namesList: List<String> = listOf("Alice", "Bob", "Charlie")\n// namesList[0] = "Eve" // Erreur ! listOf retourne une liste immuable\n\nEn substance, listOf est l'équivalent Kotlin de Java String[] avec une protection supplémentaire. En Java, un tableau peut être accidentellement modifié en le passant à une autre méthode. En Kotlin, List ne le permet pas.