Kotlin : List vs Array — quel est le piège ?
\n\nSi vous écrivez en Kotlin depuis au moins une semaine, vous vous êtes sûrement posé la question : « Mais pourquoi ne puis-je pas simplement utiliser Array partout ? Pourquoi ai-je besoin de ces List et MutableList ? »
Cette question est l'une des plus populaires sur Stack Overflow. Et ce n'est pas sans raison. À première vue, la liste et le tableau stockent tous deux des éléments, on peut y accéder par index, on peut les parcourir. Mais creusez un peu plus — et vous découvrirez des différences fondamentales qui affectent les performances, la sécurité du code et même votre façon de penser lors de la conception de l'architecture.
\n\nDans ce tutoriel, nous allons détailler point par point la différence entre List et Array en Kotlin. Vous apprendrez quand utiliser un tableau et quand utiliser une liste, et pourquoi les développeurs expérimentés choisissent presque toujours List.
1. Les bases : qu'est-ce que Array en Kotlin ?
\n\nArray en Kotlin est une projection directe du tableau Java. C'est une séquence fixe d'éléments du même type. Lorsque vous créez un tableau, vous allouez immédiatement la mémoire correspondante. Vous ne pouvez pas modifier la taille du tableau après sa création.
// Création d'un tableau\nval numbers: Array<Int> = arrayOf(1, 2, 3, 4, 5)\nprintln(numbers[0]) // 1\nnumbers[2] = 10 // on peut modifier la valeur\nprintln(numbers[2]) // 10\n\nLes tableaux en Kotlin sont mutable (modifiables) par nature : vous pouvez toujours remplacer un élément par son index. Mais vous ne pouvez pas ajouter un nouvel élément ni en supprimer un existant. La taille est fixée pour toujours.
\n\nCaractéristiques de Array :
\n- \n
- Taille fixe — impossible d'ajouter ou de supprimer un élément. \n
- Contenu modifiable — on peut réécrire les éléments. \n
- Performances — maximales, car il s'agit d'un accès direct à la mémoire.
- Tableaux primitifs — il existe des types spéciaux :
IntArray,ByteArray,FloatArray, etc. Ils fonctionnent sans boxing, ce qui offre un gain de vitesse.
// Tableau primitif — sans boxing\nval intArray: IntArray = intArrayOf(1, 2, 3, 4, 5)\n\n2. Les bases : qu'est-ce que List en Kotlin ?
\n\nList est une interface de la bibliothèque standard de Kotlin. Contrairement au tableau, la liste est une abstraction. Vous ne savez pas exactement comment elle stocke les données en interne (cela peut être ArrayList, LinkedList ou autre chose).
// Création d'une liste immuable\nval fruits: List<String> = listOf("pomme", "banane", "cerise")\nprintln(fruits[0]) // pomme\n// fruits[0] = "orange" // Erreur de compilation !\n\nLa principale « particularité » de Kotlin est la séparation entre read-only (lecture seule) (List) et mutable (MutableList).
List (read-only) :
\n- \n
- Impossible de modifier le contenu (ni ajouter, ni supprimer, ni remplacer).
- Lecture seule.
- Plus sûr pour le transfert de données entre composants.
MutableList :
\n- \n
- Possibilité d'ajouter, supprimer, remplacer des éléments.
- Taille dynamique.
- En pratique,
ArrayListest le plus souvent utilisé en interne.
val mutableFruits: MutableList<String> = mutableListOf("pomme", "banane")\nmutableFruits.add("orange") // OK\nmutableFruits.remove("banane") // OK\nmutableFruits[0] = "poire" // OK\n\n3. Différences clés entre List et Array
\n\nRésumons tout cela dans un tableau visuel (dans le code — sous forme de commentaires).
\n\n// 1. Mutabilité\nval array = arrayOf(1, 2, 3)\narray[0] = 99 // ✅ Fonctionne\n\nval list = listOf(1, 2, 3)\n// list[0] = 99 // ❌ Erreur de compilation\n\nval mutableList = mutableListOf(1, 2, 3)\nmutableList[0] = 99 // ✅ Fonctionne\n\n// 2. Taille\nval fixedArray = arrayOf(1, 2, 3)\n// fixedArray.add(4) // ❌ Cette méthode n'existe pas\n\nva