Méthode contains() de Java HashSet
contains()La méthode est une méthode couramment utilisée en JavaHashSetfournie par la classe HashSet, utilisée pour vérifier si la collection contient l'élément spécifié. Cette méthode renvoie une valeur booléenne indiquant si l'élément existe.
Syntaxe de la méthode
Paramètres de méthode
| Paramètre | Type | Description |
|---|---|---|
| o | Object | L'élément à rechercher dans la collection |
Valeur de retour
| Type de valeur de retour | Description |
|---|---|
| booléen | Renvoie true si la collection contient l'élément spécifié ; sinon, renvoie false |
Fonctionnement de la méthode
HashSetdecontains()L'implémentation sous-jacente de la méthode repose sur une structure de données de table de hachage :
- Tout d'abord, calculez le code de hachage de l'objet passé en argument
- Localisez la position correspondante (bucket) dans la table de hachage en fonction du code de hachage
- Recherchez dans cette position (bucket) un objet égal (en utilisant
equals()la méthode equals() pour la comparaison)
Exemple d'utilisation
Utilisation de base
Exemple
public class HashSetExample {
public static void main(String[] args) {
// Créer un HashSet
HashSet<String> fruits = new HashSet<>();
// Ajouter des éléments
fruits.add("Pomme");
fruits.add("Banane");
fruits.add("Orange");
// Vérifie si l'élément existe
System.out.println("Contient Apple ? " + fruits.contains("Apple")); // vrai
System.out.println("Contient Mango ? " + fruits.contains("Mango")); // faux
}
}
Objets personnalisés
Lorsque vous utilisez des objets personnalisés, vous devez redéfinir correctementhashCode()etequals()les méthodes hashCode() et equals() :
Exemple
class Student {
private int id;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
// Il faut redéfinir les méthodes hashCode et equals
@Override
public int hashCode() {
return id;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return vrai;
if (obj == null || getClass() != obj.getClass()) return false;
Student student = (Student) obj;
return id == student.id;
}
}
public class CustomObjectExample {
public static void main(String[] args) {
HashSet<Student> students = new HashSet<>();
students.add(new Student(1, "Alice"));
students.add(new Student(2, "Bob"));
System.out.println("Contains Alice? " +
students.contains(new Student(1, "Alice"))); // vrai
}
}
Considérations de performance
HashSetdecontains()La méthode a généralement une complexité temporelle en O(1) car elle est basée sur une table de hachage. Cependant, dans le pire des cas (lorsque tous les éléments ont des collisions de hachage), la complexité temporelle se dégrade en O(n).
7. Remarques
- Gestion des valeurs null:
HashSetIl autorise un élément null ; vous pouvez utiliser contains()contains(null)pour vérifier sa présence - Égalité des objets: Pour déterminer si un objet est contenu, il s'appuie sur la
equals()méthode equals() plutôt que l'opérateur == - Collision de hachage: Une bonne
hashCode()implémentation de hashCode() peut réduire les collisions de hachage et améliorer les performances - Accès concurrent:
HashSetNon thread-safe. Dans un environnement multithread, vous devez faire attention aux problèmes de synchronisation.
FAQ
Pourquoi la méthode contains() renvoie-t-elle parfois des résultats incorrects ?
C'est généralement parce que vous n'avez pas correctement redéfinihashCode()etequals()les méthodes hashCode() et equals(). Deux objets logiquement égaux doivent renvoyer le même code de hachage, etequals()la méthode equals() doit renvoyer true.
Quelle est la différence entre la méthode contains() et la méthode containsAll() ?
contains(): Vérifie si un seul élément existecontainsAll(): Vérifie si tous les éléments de la collection spécifiée sont inclus
Comment puis-je améliorer les performances de la méthode contains() ?
- Assurez-vous que les implémentations des méthodes
hashCode()hashCode() et equals() de l'objet personnalisé sont bonnes, réduisant les collisions de hachage - Pour les grandes collections, envisagez d'ajuster la capacité initiale et le facteur de charge
- Utilisez une structure de données plus adaptée (comme TreeSet) si l'ordre est plus important
Java HashSet