1. 程式人生 > 實用技巧 >用HashSet儲存自定義型別物件的雜湊值

用HashSet儲存自定義型別物件的雜湊值

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}]
    }
}