ProgrammationDéveloppeur Backend

Comment fonctionnent les collections en Java ? Quelles sont les différences entre ArrayList, LinkedList et HashMap ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Java, les collections implémentent des structures de données pour travailler avec des groupes d'objets. Les principales structures :

  • ArrayList (implémente l'interface List) stocke des éléments dans un tableau, offre un accès rapide par index, mais l'insertion/suppression d'éléments au milieu est lente, car elle nécessite un décalage des éléments.

  • LinkedList (implémente également List) est construit sur une liste doublement chaînée. Il insère/supprime rapidement des éléments au milieu, mais l'accès par index est lent, car il faut parcourir la liste depuis le début ou la fin.

  • HashMap implémente l'interface Map. Il stocke des paires clé-valeur. L'accès rapide (O(1)) aux valeurs par clé est assuré par une fonction de hachage, mais il ne garantit pas l'ordre des éléments.

List<String> arrayList = new ArrayList<>(); arrayList.add("A"); // rapide arrayList.get(0); // rapide List<String> linkedList = new LinkedList<>(); linkedList.add("A"); // un peu plus lent linkedList.add(0, "B"); // rapide Map<String, Integer> map = new HashMap<>(); map.put("one", 1); Integer val = map.get("one"); // rapide

Question piège.

Quelle est la différence fondamentale entre HashMap et Hashtable, et pourquoi Hashtable est-elle pratiquement inutilisée dans le code moderne ?

Réponse : HashMap n'est pas synchronisé, permet null à la fois comme clé et comme valeur. Hashtable est synchronisé (plusieurs threads peuvent travailler sur un même objet sans risque d'intégrité), mais ne permet pas null et est plus lent. Dans le code moderne, on utilise plus souvent ConcurrentHashMap pour la sécurité des threads, car il est plus efficace et peut être ajusté de manière plus fine pour les calculs multithreads.

Map<String, String> map1 = new HashMap<>(); map1.put(null, "value"); // OK Map<String, String> map2 = new Hashtable<>(); map2.put(null, "value"); // NullPointerException

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Dans un système d'enregistrement des élèves, on a utilisé ArrayList pour des insertions et suppressions fréquentes au milieu de la liste, ce qui a entraîné une forte dégradation des performances avec un grand volume de données. Après remplacement par LinkedList, la situation s'est normalisée.


Histoire

Dans un système CRM multithread, on a utilisé HashMap pour stocker des données entre les threads sans synchronisation, ce qui a périodiquement conduit à des données incohérentes et à des plantages en raison de conditions de concurrence. Après le passage à ConcurrentHashMap, le bug a disparu.


Histoire

Un développeur a essayé d'ajouter une clé null dans Hashtable, sans savoir qu'il y avait une interdiction. Cela a provoqué une NullPointerException, et il a fallu du temps pour comprendre pourquoi l'application plantait de manière inattendue.