Java类覆盖equals同时必须覆盖hashCode

本文探讨了hashCode方法与equals方法的关系,特别是在自定义类中如何正确实现这两个方法以确保对象在集合中的唯一性。通过一个具体的Person类示例,解释了为何在重写equals方法时也应覆盖hashCode方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果不覆盖hashCode方法,会导致两个equals相等的实例,比如p1和p2,具有不相等的散列码,违反了hashCode的云顶。因此。add方法会把两个对象都添加到set中。

Object规范:

相等的对象,必须具有相等的散列码。

package com.rudd.io;

/**
 * Created by 67534 on 2019/3/27.
 */
public class Person {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

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

    @Override
    public boolean equals(Object obj){
        if(obj instanceof Person){
            Person person = (Person)obj;
            if(person.getName() != null && person.getAge() != null){
                if(person.getName().equals(this.name) && person.getAge().equals(this.age)){
                    return true;
                }
            }
            return false;
        }
        return false;
    }
    public Person(String name,Integer age){
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        return this.name.hashCode()+this.getAge();
    }
}
Person p1 = new Person("zxm",28);
        Person p2 = new Person("zxm",28);
        System.out.println(p1.equals(p2));
        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());

        Map<Person,Integer> map = new HashMap<Person, Integer>();
        map.put(p1,1);
        System.out.println(map.containsKey(p2));
        map.put(p2,2);

一个好的散列函数通常倾向于“为不相等的对象产生不相等的散列码”

 

对象中的关键域,equals方法涉及到的每个域。如上的name和age:

类型hashCode计算方法
boolean(f ? 1:0)
byte,char,short,int(inf)f
long(int)(f^(f>>>32))
floatFloat.floatToIntBits(f)
doubleDouble.doubleToLongBits(f)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值