-
== 既可以比较基本类型也可以比较引用类型。
对于基本类型就是比较值,对于引用类型就是比较内存地址 -
Equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
-
具体要看这有没有重写Object的hashCode方法和equals方法来判断。
当一个类有自己特有的“逻辑相等”概念,改写equals()的时候,总是要改写hashCode(),根据一个类的重写后的equals方法,两个截然不同的实例有可能在逻辑上是相等的,但是根据Object.hashCode方法,他们仅仅是两个对象。
因此,违反了“相等的对象必须有相同的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);
}
网友评论