Maison >Java >javaDidacticiel >Comment utiliser l'interface Set en Java pour stocker des tableaux sans éléments en double
L'interface Set, comme l'interface List, hérite de l'interface Collection. Les éléments de l'interface Set ne sont pas ordonnés et certaines règles sont utilisées pour garantir que les éléments stockés ne sont pas répétés.
HashSet est une classe d'implémentation de l'interface Set. Les éléments stockés ne sont pas répétables et les éléments ne sont pas ordonnés. Lorsqu'un objet est ajouté à la collection HashSet, le hashCode() de l'objet sera d'abord appelé. . ) méthode pour calculer la valeur de hachage d’un objet afin de déterminer l’emplacement de stockage de l’élément. Si les valeurs de hachage sont les mêmes à ce moment-là, appelez la méthode equals() de l'objet pour vous assurer qu'il n'y a pas d'éléments en double à cette position.
package 集合类; import java.util.HashSet; import java.util.Iterator; public class Set { public static void main(String[] args) { HashSet set=new HashSet(); set.add("hello"); set.add("world"); set.add("abc"); set.add("hello"); Iterator it=set.iterator(); while(it.hasNext()){ Object obj=it.next(); System.out.print(obj+ " "); } } }
Résultats d'exécution
Il ressort des résultats d'exécution que l'ordre de suppression des éléments n'est pas cohérent avec l'ordre d'ajout d'éléments, et les chaînes répétées sont supprimées et ajoutées une seule fois, à cause de l'ajout ( de la méthode HashSet collection ) pour stocker un élément, appelez d'abord la méthode hashCode() de l'objet actuellement stocké pour obtenir la valeur de hachage de l'objet, puis calculez un emplacement de stockage en fonction de la valeur de hachage s'il n'y a aucun élément. cet emplacement, stockez l'élément directement S'il y a un élément à cette position, la méthode égal() sera appelée pour comparer l'élément actuellement stocké avec l'élément à cette position. Si le résultat renvoyé est faux, l'élément sera stocké dans la collection. Si le résultat renvoyé est vrai, cela signifie qu'il y a un élément en double et l'élément sera supprimé.
package 集合类; import java.util.HashSet; class Student{ String id; String name; public Student(String id,String name){ this.id=id; this.name=name; } public String toString(){ String s = id + ":" + name; return s; } } public class Set1 { public static void main(String[] args) { HashSet hs=new HashSet(); Student stu1=new Student("1","hello"); Student stu2=new Student("2","world"); Student stu3=new Student("1","hello"); hs.add(stu1); hs.add(stu2); hs.add(stu3); System.out.println(hs); } }
Résultats d'exécution
Les éléments en double ne sont pas supprimés car les méthodes hashCode() et equals() ne sont pas remplacées lors de la définition de la classe Student.
package API; import java.util.HashSet; class Student{ private String id; private String name; public Student(String id,String name){ this.id=id; this.name=name; } //重写toString方法 public String toString(){ return id+ ":"+name; } //重写hashCode方法 public int hashCode(){ //返回id属性的哈希值 return id.hashCode(); } public boolean equals(Object obj){ //判断是否是同一个对象 if(this==obj){ return true; } //判断对象是Student类型 if(!(obj instanceof Student)){ return false; } //将对象强转为Student类型 Student stu=(Student) obj; //判断id是否相同 boolean b=this.id.equals(stu.id); return b; } } public class Set2 { public static void main(String[] args) { HashSet hs=new HashSet(); Student stu1=new Student("1","hello"); Student stu2=new Student("2","world"); Student stu3=new Student("1","hello"); hs.add(stu1); hs.add(stu2); hs.add(stu3); System.out.println(hs); } }
Résultats d'exécution
Parce que la classe Student remplace les méthodes hashCode() et equals() de la classe Object. Renvoyez la valeur de hachage de l'attribut id dans la méthode hashCode(), comparez les attributs id des objets pour vérifier l'égalité dans la méthode equals() et renvoyez le résultat. Lorsque la méthode add() de la collection HashSet est appelée pour ajouter l'objet stu3, on constate que sa valeur de hachage est la même que celle de l'objet stu2 et stu2.equals(stu3) renvoie true. HashSet détermine que les deux objets sont identiques, de sorte que les objets Student en double sont supprimés.
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!