学生类,定义两个属性并重写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无法删除也是这个原因。
本文介绍了一个学生类的设计,该类包含年龄和姓名两个属性,并重写了hashCode和equals方法。通过一个测试类演示了当修改对象属性后,原有的hashcode不变导致的行为表现,包括集合中元素的增删特性。
1043





