美文网首页
重写equals之后,重写hashcode方法是否必要

重写equals之后,重写hashcode方法是否必要

作者: 屎倒淋头还嚼便 | 来源:发表于2020-04-08 16:44 被阅读0次
package com.example.demo;

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

public class Test {
    public static void main(String[] args) {
        Set<Student> o = new HashSet<>();
        Student o1 = new Student(1,"zhangsan");
        Student o2 = new Student(1,"zhangsan");
        o.add(o1);
        o.add(o2);
        /**
         *  根据业务要求:如果两个学生的编号、姓名相同,则认为是同一个学生。
         *  原理:Object.hashCode()生成哈希值,由于不可避免地会存在哈希值冲突的情况,因此当哈希值相同时,还需要再调用equals进行一次值的比较,
         *  但是,若哈希值不同,将直接判定Objects不同,跳过了equals,这加快了冲突处理效率。
         * 
         *  (1)两个对象的equals结果相等,则两个对象的哈希值必须相同。 (两个对象的哈希值不同,则一定是不同的对象。如果哈希值相同,则再根据equals判断是不是不同的对象)
         * 
         *  这个例子中的hashSet集合,判断集合中的对象是不是同一个对象时,就是先根据哈希值判断,再根据equals判断
         *  如果没有重写哈希方法,那么集合中就存入了两个对象。
         */
        System.out.println(o);
    }
}
class Student {
    private int id;
    private String name;
    public Student(int id,String name) {
        this.id = id;
        this.name = name;
    }
    @Override
    public boolean equals(Object obj) {
        // 如果为null,或者并非同类,则直接返回false
        if(obj == null || this.getClass() != obj.getClass()) {
            return false;
        }
        if(this == obj) { // 内存地址相同,返回true
            return true;
        }
        Student obj2 = (Student)obj; // 强转为学生类
        if(this.getId() == obj2.getId() && this.getName().equals(obj2.getName())) { // 如果编号、姓名相同,则认为是同一个学生类
            return true;
        }
        return false;
    }
    @Override
    public int hashCode() {
        return id+name.hashCode(); // 如果(编号+姓名的hash值)不同,则肯定不是同一个学生。
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
}

相关文章

网友评论

      本文标题:重写equals之后,重写hashcode方法是否必要

      本文链接:https://www.haomeiwen.com/subject/kkwtmhtx.html