Java 里的 equals 方法

336 天前
 lmybill

equals 本来比较的是两个对象是否是同一个对象,到 String 等类里却重写为比较值是否相等,这是不是改变了这个方法的原来意思,给人造成很大困扰

2303 次点击
所在节点    Java
29 条回复
lyusantu
336 天前
写注释的人都没你们想得多
Koril
336 天前
“equals 本来比较的是两个对象是否是同一个对象”——这句话是不是存在问题?用 == 判断是不是一个对象,而覆写 equals 的情况,是类具有自己特有的“逻辑相等”的概念,和对象等同的概念不一样,一般发生在“值类”中,我没理解错的话,String 也是值类的一种。
RoccoShi
335 天前
"先问是不是,再问为什么"
siweipancc
335 天前
你对语言的定义理解有偏差,看看别语言也是同样的逻辑的,你就说不出话了
tairan2006
335 天前
第一句就错了啊… == 才是用来判断同一个对象的。

至于别的语言,能重载操作符的肯定能实现任意语义;有指针的语言可以直接比较指针;各有各的思路吧。
gaifanking
335 天前
@nothingistrue 人家说 Object ,你自作主张加个复数变成 Objects 干啥?
仔细看 Object 的 equals 定义 Returns 部分:
true if this object "is the same" as the obj argument; false otherwise.
gaifanking
335 天前
@tairan2006 @Koril @LeegoYih @Nooooobycat
楼主是从面向对象的设计角度提问的,跟==没有一毛钱关系
OO 原则里有一条叫里氏替换,子类覆盖父类方法时,可以修改算法规则,但不能改变父类原意。

楼主的疑问我在前面已经回答了:
same ,在英语里即可以表示同一个,也可以表示一模一样(指两个)
equal , 在英文里即可以表示相同,也可以表示相等

还不清楚自己查词典吧
@lmybill
nothingistrue
335 天前
放上 Object.equals 方法的 javadoc 的,8 英文原版、8 中文机器翻译、上古 1.6 官方中文版本,免得白痴再通过以偏概全、扣字眼来拉低水平。

另提示:Object 作为最高基类,具备模板的作用,但它既不是接口,也不是虚拟类; Object 的方法都是实际方法,不是接口方法,也不是虚拟类,在阅读这类方法的 Javacod 时,需要区分好哪些是说自己的,哪些是说给子类的。




__JDK 8 英文原版__
Indicates whether some other object is "equal to" this one.

The equals method implements an equivalence relation on non-null object references:

It is reflexive: for any non-null reference value x, x.equals(x) should return true.
It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
For any non-null reference value x, x.equals(null) should return false.

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

Parameters:
obj - the reference object with which to compare.
Returns:
true if this object is the same as the obj argument; false otherwise.
See Also:
hashCode(), HashMap

__JDK 8 机翻__
指示某个其他对象是否“等于”这个对象。

equals 方法在非空对象引用上实现等价关系:

它是自反的:对于任何非空引用值 x ,x.equals(x) 应该返回 true 。
它是对称的:对于任何非空引用值 x 和 y ,当且仅当 y.equals(x) 返回真时,x.equals(y) 应该返回真。
它是传递性的:对于任何非空引用值 x 、y 和 z ,如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true ,则 x.equals(z) 应该返回 true 。
它是一致的:对于任何非空引用值 x 和 y ,多次调用 x.equals(y) 始终返回 true 或始终返回 false ,前提是在对象的 equals 比较中使用的信息没有被修改。
对于任何非空引用值 x ,x.equals(null) 应该返回 false 。

类 Object 的 equals 方法在对象上实现了最具鉴别力的可能等价关系; 也就是说,对于任何非空引用值 x 和 y ,当且仅当 x 和 y 引用同一对象( x == y 的值为 true )时,此方法才返回 true 。

请注意,通常需要在重写此方法时重写 hashCode 方法,以维护 hashCode 方法的一般契约,该契约规定相等的对象必须具有相等的哈希码。

参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则为真;否则为真。 否则为假。
也可以看看:
hashCode(), HashMap
nothingistrue
335 天前
__JDK 1.6 SUN 认证的志愿者翻译__

指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x ,x.equals(x) 都应返回 true 。
对称性:对于任何非空引用值 x 和 y ,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true 。
传递性:对于任何非空引用值 x 、y 和 z ,如果 x.equals(y) 返回 true ,并且 y.equals(z) 返回 true ,那么 x.equals(z) 应返回 true 。
一致性:对于任何非空引用值 x 和 y ,多次调用 x.equals(y) 始终返回 true 或始终返回 false ,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x ,x.equals(null) 都应返回 false 。

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y ,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true ( x == y 具有值 true )。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true ;否则返回 false 。
另请参见:
hashCode(), Hashtable

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/946946

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX