我们都知道如果我们创建两个String对象并使用==来比较它们将返回false,如果我们使用equals方法它将返回true。但默认情况下等于方法实现==,那么它如何返回true,它应该返回==返回的是什么?
答案 0 :(得分:8)
默认情况下是等于==
类中的方法实现Object
。但是,您可以覆盖自己类中的equals
方法,以更改同一类的两个对象之间的equality
方式。例如,equals
类中的String
方法被覆盖如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
所以这就是以下代码的原因:
String s1 = new String("java");
String s2 = new String("java");
s1==s2
返回false
,因为它们都在堆上引用不同的对象。而s1.equals(s2)
返回true
,因为现在调用的equals
是在String
类中定义的String
对象基于contents
进行比较的内容字符串。
答案 1 :(得分:1)
重写String类中的equals方法,它会尝试检查两个字符串中的所有字符是否相等。如果找到则返回true。因此String类中equals方法的行为与它的正常对象类实现不同。
答案 2 :(得分:0)
equals
方法最初是Object
类的方法。 Java中的每个类都默认扩展Object
类。现在,equals
类覆盖了String
方法,其行为与==
不同。
javadoc完美地解释了它:
将此字符串与指定对象进行比较。结果是 当且仅当参数不为null且为a时,才为true String对象,表示与此字符相同的字符序列 对象
它的实施如下:
@override
public boolean equals(Object anObject) {
// This check is just for the case when exact same String object is passed
if (this == anObject) {
return true;
}
// After this only real implementation of equals start which you might be looking for
// For other cases checks start from here
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
答案 3 :(得分:0)
.equals()
检查字符串是否相同ei。有相同的字符。 ==
仅检查指针是否指向相同的对象。您可以使用相同的字符使用不同的对象,这就是您应该使用.equals()
来比较它们的原因
答案 4 :(得分:0)
String
类覆盖equals
类的Object
方法,以便比较两个字符串的内容而不是比较引用(Object
中的默认实现} class)。
请参阅下面equals
类的String
方法实现:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}