假设我们在Java中有一个用户定义的类,有两个实例a和b。是否有可能出现这种情况:a == b,但 a.equals(b) 返回false?
.equals()
的实现完全取决于类,所以我可以这样写:class Foo
public boolean equals(Object other) {
return false;
}
}
现在,无论您传递哪两个实例 - 即使是完全相同的实例两次 - 我总是会说它们不相等。
这种设置特别愚蠢,但它说明了您可以从.equals()
中获取同一对象两次的false
结果。
请注意,我们在这里讨论的是可能发生的情况,而不是应该发生的情况。任何类都不应该实现一个.equals
方法来声明一个对象与其自身不相等。对于受信任的代码,可以合理地假设永远不会发生这种情况。
a == b
,那么 a.equals(b)
应该是 true。如果 a.equals(b)
,那么 a == b
可能是 true,但不一定。
==
运算符只测试两者是否引用同一个对象。而 equals
执行您实现的逻辑。后者可以被覆盖,前者是语言中的运算符,在 Java 中不能被覆盖。
== 运算符和 equals() 方法有什么区别?(带有 hashcode() ???)
来自 java.lang.Object
文档:
是的,只需要重载equals
来做一些愚蠢的事情。例如:
class Foo {
@Override
boolean equals(Object rhs) { return false; }
}
是的,我们可以重载.equals
函数来得到期望的输出。但是在任何情况下,==
返回true而.equals
返回false的情况是不存在的。
class s {
int a;
}
class dev {
public static void main(String args[]) {
s a = new s();
s b = new s();
System.out.println(a == b);
System.out.println(a.equals(b));
}
}
equals
方法可以被重写,以提供除了典型的 ==
方法之外的自定义功能。此外,一些类型如 Strings
在使用 == 方法时不会返回 true。您必须使用 .equals
或 .compareTo
(返回 0 时相等)。
这应该提供一些额外的帮助
public class Wrong{
public boolean equals(Object other)
{
return false;
}
}
.equals()
的正常规则 - 参见Javadocs - 但除了好的判断之外没有什么可以阻止你。package com.stackOverFlow;
import java.util.Date;
public class SampleClass {
public static int myint = 1;
private SampleClass() {
};
public Integer returnRandom() {
return myint++;
}
private static SampleClass _sampleClass;
public static SampleClass getInstance() {
if (_sampleClass == null) {
_sampleClass = new SampleClass();
}
return _sampleClass;
}
@Override
public boolean equals(Object other) {
if (this.returnRandom().equals(((SampleClass) other).returnRandom())) {
return true;
}
return false;
}
}
package com.stackOverFlow;
public class Run {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SampleClass a = SampleClass.getInstance();
SampleClass b = SampleClass.getInstance();
if(a==b){
System.out.println("references are same as they are pointing to same object");
if(!a.equals(b)){
System.out.println("two random number Instance will never be same");
}
}
}
}
你可以通过实际例子理解这个概念。单例模式类会始终返回相同的引用,而你可以重写equals方法以获得不是类变量的内容,例如在两个特定时间从数据库中获取值或一个随机数。希望这能澄清你的问题。