首页 > 其他 > 详细

用HashSet存储自定义类型对象的哈希值

时间:2020-11-05 21:23:20      阅读:33      评论:0      收藏:0      [点我收藏+]

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

用HashSet存储自定义类型对象的哈希值

原文:https://www.cnblogs.com/Han-Song/p/13933686.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!