==和equals的区别

2019-08-07  本文已影响0人  ElevenKing

当一个类有自己特有的“逻辑相等”概念,改写equals()的时候,总是要改写hashCode(),根据一个类的重写后的equals方法,两个截然不同的实例有可能在逻辑上是相等的,但是根据Object.hashCode方法,他们仅仅是两个对象。

因此,违反了“相等的对象必须有相同的hashCode

结论: \color{red}{重写equals的时候一定要同时重写hashcode方法 }

为了遵守:2个对象equals, hashCode一定相同规则。
参与equals函数的字段,也必须都参与hashCode 的计算。

工具生成的equals方法为什带31这个数字?

hashCOde

计算机的乘法涉及到移位计算。当一个数乘以2时,就直接拿该数左移一位
即可!选择31原因是因为31是一个素数!所谓素数:质数又称素数(在一个
大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数)

在存储数据计算hash地址的时候,我们希望尽量减少有同样的hash地址,所
谓“冲突”。

因为任何数n * 31就可以被JVM优化为 (n << 5) -n,移位和减法的操作效率要比
乘法的操作效率高的多,对左移虚拟机里面都有做相关优化,并且31只占用
5bits!

public class Animal  {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("aaa");
        dog.setAge(1);
        Cat cat = new Cat();
        cat.setName("aaa");
        cat.setAge(1);
        System.out.println(dog.equals(cat));

    }
}
@Setter
class Dog  {
    private String name;
    private Integer age;

}
@Setter
class Cat  {
    private String name;
    private Integer age;
}

Dog和Cat未重写equals()和hashCode()方法时,dog.equals(cat) 调用的是Object.queals()方法
即: dog.equals(cat) 等同于 dog == cat

    public boolean equals(Object obj) {
        return (this == obj);
    }
上一篇下一篇

猜你喜欢

热点阅读