用HashSet儲存自定義型別物件的雜湊值
阿新 • • 發佈:2020-11-05
set集合報錯元素唯一:
儲存的元素(String,Integer,…Student,Person…),必須重寫hashCode方法和equals方法(不重寫的話,實現不了唯一)
注:在判斷兩個物件A、B是否重複時,先判斷雜湊值是否一樣,再判斷A.equals(B)是否為true
題目要求:
同名同年齡的人,視為同一個人,只能儲存一次
1.沒重寫前:
import java.util.HashSet; class Person{ private String name; private int age; public Person() { } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class HashTest { public static void main(String[] args) { //建立HashSet集合儲存Person HashSet<Person> set=new HashSet<>(); Person p1=new Person("劉備",40); Person p2=new Person("劉備",40); Person p3=new Person("劉備",50); System.out.println(p1.hashCode());//1967205423 System.out.println(p2.hashCode());//42121758 System.out.println(p1==p2);//地址值肯定不等,false System.out.println(p1.equals(p2));//false set.add(p1); set.add(p2); set.add(p3); System.out.println(set);//記得先重寫toString方法先,不然就會變成[Person@13b6d03, Person@282ba1e, Person@75412c2f] //[Person{name='劉備', age=50}, Person{name='劉備', age=40}, Person{name='劉備', age=40}] } }
2.重寫後
只有需要唯一,才需要重寫hashCode方法和equals方法(而且只能是set才能用,list不行)
重寫後,對於名字相同,年齡相同的物件,他們的hash值相等和equals也相等了。
import java.util.HashSet; import java.util.Objects; public class Person{ private String name; private int age; public Person() {} //重寫hashCode方法和equals方法 @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); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class HashTest { public static void main(String[] args) { //建立HashSet集合儲存Person HashSet<Person> set=new HashSet<>(); Person p1=new Person("劉備",40); Person p2=new Person("劉備",40); Person p3=new Person("劉備",50); System.out.println(p1.hashCode());//20903898 System.out.println(p2.hashCode());//20903898 System.out.println(p1==p2);//地址值肯定不等,false System.out.println(p1.equals(p2));//true set.add(p1); set.add(p2); set.add(p3); System.out.println(set);//[Person{name='劉備', age=40}, Person{name='劉備', age=50}] } }