set集合报错元素唯一
如果set集合中能存储进去重复的对象,就是说明没有重写hashCode方法和equals方法,用Alt+Insert就能自动重写hashCode方法和equals方法。
//主方法调用
public class HashSetPerson {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<>();
Person p1 = new Person("刘晨曦",18);
Person p2 = new Person("刘晨曦",18);
Person p3 = new Person("刘晨曦",19);
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(p1==p2);
System.out.println(p1.equals(p2));
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set);//重写toString方法
}
}
输出结果://不重写hashCode()和equals()
2129789493
668386784
false
false
[Person{name=‘刘晨曦’, age=18}, Person{name=‘刘晨曦’, age=18}, Person{name=‘刘晨曦’, age=19}]
//Person类(重写了hashCode()和equals())
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
输出结果://重写后
652098813
652098813
false
true
[Person{name=‘刘晨曦’, age=19}, Person{name=‘刘晨曦’, age=18}]