Vin*_*nce 2 java reference equals
让我们看看我们有2个用户定义类的实例的引用,Java中的a和b.是否会出现a == b但a.equals(b)返回false的情况?
当然!实现.equals()完全取决于类,所以我可以写:
class Foo
public boolean equals(Object other) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
现在你传递的两个实例并不重要 - 即使是完全相同的实例两次 - 我总是会说它们不相等.
这个特别的设置很愚蠢,但它说明你可以false从.equals()同一个对象获得两次结果.
请注意,我们在这里谈论可能发生的事情,而不是应该发生什么.任何类都不应该实现.equals声称对象不等于自身的方法.对于可信代码,假设永远不会发生这种情况是合理的.
if a == b那么a.equals(b)应该是真的。如果a.equals(b)那么也许a == b但不一定。
操作==符只是测试两者是否引用同一个对象。Whileequals执行您实现的逻辑。最后一个可以被覆盖,第一个是语言中的运算符,例如在 Java 中不能被覆盖。
== 运算符和 equals() 有什么区别?(使用 hashcode() ???)
来自java.lang.Object文档:
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,如果对象的 equals 比较中使用的信息没有被修改,则多次调用 x.equals(y) 一致返回 true 或一致返回 false。
- 对于任何非空引用值 x,x.equals(null) 应返回 false。