使用hashset储存自定义对象时,如何保证储存元素的唯一性,需要重写学生类的equals和hashcode方法
时间: 2023-06-14 08:02:45 浏览: 113
是的,当你使用HashSet来储存自定义对象时,需要重写该对象的equals()和hashCode()方法,来确保HashSet中没有重复的元素。
equals()方法是用来比较两个对象是否相等的,而hashCode()方法是用来计算对象的哈希码,HashSet通过哈希码来确定元素在集合中的位置,以便快速地搜索和访问元素。
如果两个对象在equals()方法上返回true,并且它们的hashCode()方法返回的哈希码相同,那么HashSet就认为它们是相同的对象,只会储存其中一个对象。
因此,当你使用HashSet来储存自定义对象时,需要确保equals()和hashCode()方法的实现是正确的。一般来说,equals()方法需要比较对象的各个属性是否相等,而hashCode()方法需要根据对象的属性计算出一个唯一的哈希码。
相关问题
hashset重写hashcode和equals
在使用HashSet时,如果要将自定义对象作为元素存储在其中,则需要重写该对象的hashCode()和equals()方法。
hashCode()方法用于确定元素的哈希值,用于在HashSet中确定元素的位置。
equals()方法用于比较两个元素是否相等。如果两个元素的hashCode()值相同,则会调用equals()方法来确定它们是否相等。
重写这两个方法的规则如下:
- hashCode()方法:
1. 在同一对象中多次调用hashCode()应该返回相同的整数。
2. 如果equals()比较两个对象相等,则它们的hashCode()返回值应该相同。
3. hashCode()返回值不一定唯一,不同对象可能会返回相同的整数。
- equals()方法:
1. 自反性: 对于任何非空引用x,x.equals(x)应该返回true。
2. 对称性: 对于任何非空引用x和y,当且仅当y.equals(x)返回true时,x.equals(y)也应该返回true。
3. 传递性: 对于任何非空引用x,y,z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也应该返回true。
4. 一致性:对于任何非空引用x和y,多次调用x.equals(y)应该始终返回相同的结果在使用HashSet的时候,为了保证对象的唯一性,需要重写对象的hashCode和equals方法。
hashCode方法用于生成对象的哈希码,HashSet在添加对象时会使用该哈希码来判断对象是否重复。
equals方法用于判断两个对象是否相等。如果重写了hashCode方法,一般也要重写equals方法。
重写这两个方法时,需要遵循以下规则:
1.如果两个对象相等,那么它们的hashCode值一定相等。
2.如果两个对象的hashCode值相等,那么它们不一定相等。
3.equals方法需要遵循传递性,对称性和自反性
定义Student类,成员变量包含姓名和学号属性。创建4个学生存储到HashSet中,学号相同的人则看做同一人不进行存储(需重写Student类中的hashCode()和equals()方法),最后打印HashSet中的学生信息
首先,我们需要创建一个名为`Student`的类,包含姓名(name)和学号(studentId)作为成员变量。为了满足HashSet的要求,我们还需要重写`hashCode()`和`equals()`方法,以便基于学号确定学生的唯一性:
```java
import java.util.HashSet;
import java.util.Set;
class Student {
private String name;
private int studentId;
public Student(String name, int studentId) {
this.name = name;
this.studentId = studentId;
}
// Overriding equals method to compare based on studentId
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Student otherStudent = (Student) obj;
return this.studentId == otherStudent.studentId;
}
// Overriding hashCode method for consistent behavior with equals
@Override
public int hashCode() {
return Objects.hash(name, studentId);
}
// Getters and setters (not shown here)
}
public class Main {
public static void main(String[] args) {
Set<Student> uniqueStudents = new HashSet<>();
Student student1 = new Student("张三", 1001);
Student student2 = new Student("李四", 1001); // 同一学号
Student student3 = new Student("王五", 1002);
Student student4 = new Student("赵六", 1001); // 同一学号
// 添加学生到HashSet
uniqueStudents.add(student1);
uniqueStudents.add(student2); // 由于已存在学号相同的student1,不会添加
uniqueStudents.add(student3);
uniqueStudents.add(student4); // 由于已存在学号相同的student1,不会添加
// 打印Set中的唯一学生
System.out.println("Unique students in the set:");
for (Student s : uniqueStudents) {
System.out.println(s.getName() + " (" + s.getStudentId() + ")");
}
}
}
```
在这个例子中,只有两个不同的学生(张三和王五)会被存储在HashSet中,因为他们的学号不同。运行`main`方法后,你会看到输出结果:
```
Unique students in the set:
张三 (1001)
王五 (1002)
```
阅读全文