HashSet 存储自定义对象时重写hashCode和equal

2018-11-16  本文已影响0人  dev晴天

前言:

以前总是迷惑为什么要同时重写这两个方法,想在终于明白了些,在这里总结下由来。

package day12.hash;

import java.util.Objects;

/**
 * Create by SunnyDay on 2018/11/16
 */
public class Student {
    int age;
    String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        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);
    }
}

package day12.hash;

import java.util.HashSet;
import java.util.Set;

/**
 * Create by SunnyDay on 2018/11/16
 * 哈希简介    以HashSet为栗子
 */
public class HashDemo {
    public static void main(String[] args) {
        // 首先举个简单的栗子
        Set<String> set1 = new HashSet<>();
        set1.add("熊大");
        set1.add("熊二");
        set1.add("光头强");
        set1.add("熊大");
        System.out.println(set1);
        /*
         打印:
         [熊大, 光头强, 熊二]
         Process finished with exit code 0
        * 可以看出 hashset 具有无序性  而且当出现相同的元素时(如上的熊大),只会存取一个
        * */

        // 栗子延伸
        Set<Student> set = new HashSet<>();
        Student stu1 = new Student();
        Student stu2 = new Student();
        Student stu3 = new Student();
        Student stu4 = new Student();

        stu1.setAge(20);
        stu1.setName("熊大");

        stu2.setAge(21);
        stu2.setName("熊二");

        stu3.setAge(22);
        stu3.setName("光头强");

        stu4.setAge(21);
        stu4.setName("熊二");

        set.add(stu1);
        set.add(stu2);
        set.add(stu3);
        set.add(stu4);
        System.out.println(set);
      /*
      * 打印:
      * [Student{age=22, name='光头强'}, Student{age=21, name='熊二'}, Student{age=20, name='熊大'}, Student{age=21, name='熊二'}]
      *  可以看到:stu1 的name age 和stu4 的 name age 值是相同的(这时因为你存的为student对象,每个对象是不同的 所以存在了set集合中)
      *  通常我们希望对象的 age 和 name都不同(如下)
      * */

   /*    进入Student类重写equals hashcode方法(先通过编译器自动生成 idea快捷 alt+insert)
         打印:
         [熊大, 光头强, 熊二]
        [Student{age=21, name='熊二'}, Student{age=20, name='熊大'}, Student{age=22, name='光头强'}]

        发现重写后没有重复的了
    */
         // 哈希的分析:动态数组+哈希算法
        // 参考图解

    }

}

image.png

小结

这里只是记录下由来,以及简单的画图模型阐述下,详细的哈希算法我也不了解,这里只是自己的笔记记录下啊哈哈!!!

上一篇 下一篇

猜你喜欢

热点阅读