Java中HashSet是Set的实现类,它是根据对象的哈希值确定元素的存储位置,它里面的元素是无序的(存入和读取顺序不一致)、不重复的。而【 【HashSet实现数据不重复原理】大概解释了他是如何实现的。
但是我们在常用的时候就会发现,HashSet并不能把我们认为相同的数据类型删除,这是因为程序对相同的数据都要进行hashCode和equals两种方法的判断,而这两种方法有时候却不能成功判断是否是一组相同的数据,这时候我们就得重写HashCode和equals这两种方法。
修改前
package Package5.test1Set;
import java.util.HashSet;
public class SetTest {
public static void main(String[] args) {
//重写HashSet方法,
HashSet set=new HashSet();//set集合内的元素不重复1.hashset的函数值一样,2.equals返回值为turn
set.add(new Student("java",20));
set.add(new Student("c",30));//这里我们输入了两组相同的数据
set.add(new Student("c",30));
System.out.println(set);
System.out.println(set.size());
}
}
package Package5.test1Set;
import java.sql.SQLOutput;
public class Student {
private String name;
private Integer age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
运行后,即使存在两组数据相同的情况下,集合内还是有三个元素,这是因为3个数据的哈希值不同,他们存储的位置不同,所以程序判定他们是两组不同的数据。
修改后
package Package5.test1Set;
import java.sql.SQLOutput;
public class Student {
private String name;
private Integer age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
//只有重写这个方法才能使重复的元素消除,经常用于数据可以同名数据的删除
@Override
public int hashCode(){
return this.name.hashCode() | this.age.hashCode();
}
@Override
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(!(obj instanceof Student)){//instanceof方法用于比较左右两端是否是同一个对象
return false;
}
Student student=(Student)obj;
if(this.age.equals(student.age)&&this.name.equals(student.name)){
return true;
}
return false;
}
}
当我们重写了hashCode()和equals方法后就可以删除重复变量了。
总结:重写hashCode()方法和equals()方法其实就是对hashSet底层的逻辑进行修改,让判定更为严格,以此来达到我们删除重复数据的目的。



