Java equals 与 "==" 的区别
理解 HashSet 的时候遇到的问题,在这里记录一下:
-
使用 == 进行比较, 该方式比较的是变量是否同时指向一块内存地址,如果是就返回 true,否则返回 false
-
使用对象本身的 equals 进行比较,equals 首先会进行 == 比较,然后会进行逻辑比较,当然你可以自己定义自己的比较逻辑,比如 JDK 内置的 String,Integer,Long 等都是重写了这个 equals 方法的。
-
总的来说就是 == 表示完全相等,而 equals 表示逻辑相等
注意:两个对象相等 Hashcode 一定相等(object 类的 hashcode 算法 hashcode 算出来的结果就是该对象在内存中的地址的十进制表示),两个对象的 hashcode 相等不一定是一个对象(重写 hashcode 方法),所以 hashcode 不能用于比较两个对象是否相等
下面这一段转自: http://blog.csdn.net/hudashi/article/details/6944491 ,便于理解 hashcode 与 equals() 之间的关系
根据 hashCode 的常规协定首先要明白一个问题:
一,
equals() 相等的两个对象,hashcode() 一定相等.
二,equals()不相等的两个对象,却并不能证明他们的 hashcode() 不相等。
换句话说,equals() 方法不相等的两个对象,hashcode() 有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)。
三,反过来:hashcode() 不等,一定能推出 equals() 也不等 (因为如果 equals() 相等的话就和第一条矛盾了);
hashcode() 相等,equals() 可能相等,也可能不等。
来源: http://www.bubuko.com/infodetail-2451358.html