Hé, passionné de Java ! Que vous soyez un débutant en codage essayant de comprendre pourquoi les ensembles existent, ou un programmeur aguerri se demandant s'il y a plus à apprendre, ce guide est fait pour vous. Nous sommes sur le point d'approfondir tout ce qui concerne Set en Java, de son objectif principal à son fonctionnement complexe. Attachez votre ceinture !
Tout d’abord : qu’est-ce qu’un ensemble et pourquoi devrions-nous nous en soucier ? À la base, un Set est une collection qui ne peut pas contenir d'éléments en double. En d’autres termes, chaque élément d’un ensemble est aussi unique que votre collection de mèmes personnalisés.
Imaginez que vous soyez chargé de créer une liste d'invités pour une fête. Vous voulez vous assurer que personne ne reçoit une invitation deux fois (car c'est tout simplement embarrassant). Entrez dans l'ensemble . Avec un Set, Java garantit automatiquement que tous les éléments sont distincts. C’est parfait pour les situations où unicité est une exigence.
Aucun doublon autorisé : La caractéristique la plus importante d'un ensemble est qu'il jamais n'autorise les éléments en double. Ajouter un élément déjà présent ? Java refuse poliment (contrairement à votre patron avec plus de travail).
Non ordonné (généralement) : Les ensembles, contrairement aux listes, ne se soucient pas de l'ordre d'insertion. Ils sont heureux tant que leur caractère unique est maintenu.
Gestion des valeurs nulles : Certains ensembles autorisent la valeur nulle comme élément, mais une seule fois.
Maintenant que nous savons ce que fait un Set, voyons quels types de Sets Java propose :
Caractéristiques : Adossé à un HashMap, un HashSet est rapide et efficace pour vérifier la présence d'un élément (complexité temporelle O(1) pour la plupart des opérations).
Disposition de la mémoire : utilise une table de hachage sous le capot, où les éléments sont stockés en fonction d'une fonction de hachage.
Nulls autorisés ? : Oui, mais un seul.
Exemple de code :
Set<String> hashSet = new HashSet<>(); hashSet.add("Apple"); hashSet.add("Banana"); hashSet.add("Apple"); // This will be ignored System.out.println(hashSet); // Output: [Apple, Banana]
Caractéristiques : Un hybride entre un HashSet et une LinkedList.
Disposition de la mémoire : utilise une table de hachage et une liste doublement chaînée pour maintenir l'ordre.
Exemple de code :
Set<String> hashSet = new HashSet<>(); hashSet.add("Apple"); hashSet.add("Banana"); hashSet.add("Apple"); // This will be ignored System.out.println(hashSet); // Output: [Apple, Banana]
Caractéristiques : Implémente NavigableSet, utilise un Arbre rouge-noir pour le stockage.
Disposition de la mémoire : Une structure arborescente équilibrée.
Exemple de code :
Set<String> linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("Apple"); linkedHashSet.add("Banana"); linkedHashSet.add("Orange"); System.out.println(linkedHashSet); // Output: [Apple, Banana, Orange]
Levons le capot et jetons un coup d'œil à l'intérieur. Un HashSet utilise une table de hachage pour le stockage, où chaque élément se voit attribuer un compartiment en fonction de son code de hachage. Voici ce qui se passe lorsque vous ajoutez un élément :
Calcul du code de hachage : Java appelle la méthode hashCode() pour obtenir le code de hachage de l'élément.
Détermination du bucket : Le code de hachage est mappé à un bucket (un index de tableau).
Gestion des collisions : Si le bucket est déjà occupé (collision), Java utilise le chaînage (listes chaînées ou arbres équilibrés dans les versions Java plus récentes) pour gérer plusieurs éléments dans le même seau.
Diagramme de la structure HashSet :
Set<Integer> treeSet = new TreeSet<>(); treeSet.add(42); treeSet.add(10); treeSet.add(25); System.out.println(treeSet); // Output: [10, 25, 42]
Travailler avec des ensembles peut être amusant si vous connaissez les bonnes astuces :
[0] -> [Apple] -> [Banana] [1] -> [Grapes] [2] -> [null] [3] -> [Orange] ...
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3)); Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5)); set1.addAll(set2); System.out.println(set1); // Output: [1, 2, 3, 4, 5]
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3)); Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5)); set1.retainAll(set2); System.out.println(set1); // Output: [3]
Scénarios courants :
Garantir des noms d'utilisateur uniques dans une application.
Suivi des pages visitées dans un robot d'exploration Web.
Maintenir une collection unique d'éléments (par exemple, des électeurs uniques lors d'une élection).
Drapeaux rouges à considérer :
Si vous avez besoin d'accéder à des éléments par un index, Set n'est pas votre ami. Utilisez plutôt une liste.
Si vous avez besoin de doublons (par exemple, compter les occurrences d'éléments), pensez à Liste ou Carte.
Voici un aide-mémoire des méthodes les plus couramment utilisées :
add(E e) : Ajoute un élément s'il n'est pas déjà présent.
remove(Object o) : Supprime l'élément spécifié s'il existe.
contains(Object o) : Vérifie si un élément est dans l'ensemble.
size() : Renvoie le nombre d'éléments.
clear() : Supprime tous les éléments.
isEmpty() : Vérifie si l'ensemble est vide.
iterator() : Renvoie un itérateur sur les éléments.
Set<String> hashSet = new HashSet<>(); hashSet.add("Apple"); hashSet.add("Banana"); hashSet.add("Apple"); // This will be ignored System.out.println(hashSet); // Output: [Apple, Banana]
Ensembles simultanés :
Utilisez ConcurrentHashMap.newKeySet() ou CopyOnWriteArraySet pour les opérations thread-safe.
Ensembles immuables :
Utilisez Collections.unmodifiableSet() ou Set.of() pour créer des ensembles en lecture seule.
Set<String> linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("Apple"); linkedHashSet.add("Banana"); linkedHashSet.add("Orange"); System.out.println(linkedHashSet); // Output: [Apple, Banana, Orange]
HashSet est votre meilleur choix pour la plupart des tâches en raison de ses performances O(1) pour l'ajout, la suppression et la vérification d'éléments. TreeSet a un coût plus élevé (O(log n)) mais ajoute l'avantage de l'ordre naturel. LinkedHashSet donne un ordre d'itération prévisible avec une légère surcharge.
Reconnaître les types de problèmes :
Contrôles d'unicité (par exemple, trouver des mots uniques dans un document).
Définir les opérations (par exemple, trouver des amis communs entre utilisateurs).
Recherches rapides sans doublons (par exemple, vérifier la présence d'un élément en temps constant).
Bien que les ensembles ne soient pas aussi glamour qu'une liste ou aussi énigmatiques qu'une carte, ils jouent un rôle crucial dans la gestion efficace de collections uniques. Ce sont les héros méconnus qui garantissent que vos données restent propres et distinctes, vous épargnant ces satanés doublons qui peuvent conduire à des résultats inattendus. Que vous optimisiez un algorithme, garantissiez l'intégrité des données ou essayiez simplement de choisir une structure qui fonctionne tout simplement , comprendre les ensembles de fond en comble fera de vous un développeur plus fort. Alors allez-y et codez en toute confiance, sachant que vous avez libéré le véritable potentiel du puissant Set !
C'est fini, les amis !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!