学生类,定义两个属性并重写hashcode和equals
public class Student{
int age;
String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
}
测试类开始进行漫天过海
public class StudentCollection {
public static void main(String[] args) {
Student s1 = new Student(12, "小明");
Student s2 = new Student(11, "小红");
HashSet set = new HashSet();
set.add(s1);
set.add(s2);
s1.name = "小张";
set.remove(s1);
set.add(new Student(12,"小张"));
System.out.println(set);
}
}
结果:
解析:
当时存入s1的hashcode已经定义好,即使修改属性也不变,所以再进行填入新的元素时,比较hashcode时,由于比较的是s1的旧属性的Hashcode值,所以不会相等,就能存入新的值。之前remove无法删除也是这个原因。