18Qu'est-ce que les génériques et qu'est-ce que l'effacement de type (type erasure) ?
Les génériques permettent au code d'exprimer des conteneurs et des API sûrs en termes de types, tels que List<String>. Au moment de la compilation, le compilateur vérifie les types et insère des casts si nécessaire. Au moment de l'exécution, la plupart des informations de type générique sont effacées, de sorte que List<String> et List<Integer> partagent la même classe d'exécution. C'est pourquoi vous ne pouvez pas créer directement new T(), utiliser des paramètres de types primitifs, ou vérifier de manière fiable instanceof List<String>.
List<String> names = new ArrayList<>();
names.add("Alice");
List<? extends Number> producer;
List<? super Integer> consumer;
19Qu'est-ce que le Java Collections Framework ?
Le Collections Framework est un ensemble d'interfaces et d'implémentations pour stocker et traiter des groupes d'objets. Les interfaces principales comprennent List, Set, Queue, Deque et Map. Les implémentations incluent ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap et PriorityQueue. Choisissez une collection en fonction du modèle d'accès, des exigences de classement, de l'unicité, de la complexité de recherche, de la surcharge mémoire et des besoins de concurrence.
List<String> list = new ArrayList<>();
Set<Long> ids = new HashSet<>();
Map<Long, User> usersById = new HashMap<>();
Deque<String> queue = new ArrayDeque<>();
20Comment fonctionne HashMap ?
HashMap stocke les entrées dans des buckets sélectionnés par un hachage de la clé. Pour la recherche, il calcule le hachage, trouve le bucket et compare les clés avec equals. Les collisions sont gérées à l'intérieur du bucket ; dans Java moderne, de longues chaînes peuvent être transformées en un arbre équilibré lorsque les conditions sont remplies. HashMap permet une clé null et des valeurs nulles, n'est pas thread-safe, et peut redimensionner lorsque le seuil du facteur de charge est dépassé.
Map<Long, User> users = new HashMap<>();
users.put(user.id(), user);
User found = users.get(user.id());
21Quelle est la différence entre HashMap, LinkedHashMap, TreeMap et ConcurrentHashMap ?
HashMap fournit un accès rapide non ordonné et n'est pas thread-safe. LinkedHashMap préserve l'ordre d'insertion ou l'ordre d'accès et est utile pour les caches de type LRU. TreeMap maintient les clés triées par ordre naturel ou Comparator et possède des opérations en O(log n). ConcurrentHashMap est conçu pour un accès concurrent avec une synchronisation segmentée/interne, ne permet pas de clés ou de valeurs nulles, et est préférable à synchronizedMap sous charge.
map.computeIfAbsent(key, ignored -> loadValue());
22Quelle est la différence entre ArrayList et LinkedList ?
ArrayList est basé sur un tableau. Il fournit un accès indexé rapide, un agencement mémoire compact et une itération efficace, mais l'insertion au milieu nécessite le décalage des éléments. LinkedList est une liste doublement chaînée. Elle a une insertion moins coûteuse si le nœud est déjà connu, mais l'accès indexé est en O(n), la surcharge mémoire est plus élevée et la localité du cache est pire. Dans de nombreuses applications réelles, ArrayList est plus rapide même lorsque certaines insertions sont impliquées.
23Quelle est la différence entre Comparable et Comparator ?
Comparable définit l'ordre naturel à l'intérieur de la classe via compareTo. Comparator est un objet séparé ou un lambda qui définit un ordre externe. Comparable est utile lorsqu'un type a un ordre par défaut évident. Comparator est préférable lorsqu'il y a plusieurs ordres, tels que par nom, date ou priorité. compare et compareTo doivent être cohérents et de préférence compatibles avec equals lorsqu'ils sont utilisés dans des ensembles ou des cartes triées.
class User implements Comparable<User> {
private int age;
@Override
public int compareTo(User other) {
return Integer.compare(age, other.age);
}
}
Comparator<User> byName =
Comparator.comparing(User::getName);
Comparator<User> byAgeThenName =
Comparator.comparingInt(User::getAge)
.thenComparing(User::getName);