老是容易把这两个搞混,记录下,避免下次郁闷......
第一、object.equals()与"=="是相同的,都是用来比较两个变量是否有相同的引用。
但是当用作字符串比较时,String.equals()方法则与"=="不同。
API包的java.lang.String中String.equals()重写了object.equals()这个方法,使其专用作比较两个字符串的内容是否一样。
我们可以分析一下java.lang.String.equals()方法.为了比较说明下面把object.equals()与String.equals()的代码都列出来:
1、object.equals()方法
/---------------------------------------------------------------------------------------------------------
public boolean equals(Object obj) {
return (this == obj);
}
/---------------------------------------------------------------------------------------------------------
我们可以看出Object 类中定义的 equals(Object) 方法是直接使用 "==" 比较的两个对象.
2、java.lang.String.equals()方法
/---------------------------------------------------------------------------------------------------------
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;
}
/--------------------------------------------------------------------------------------------------
在这个方法中,我们可以看出java.lang.String重写了超类的方法。
1。首先判断是不是相同的引用,因为引用相同,内容也一定相同。
2。如果引用不同,则再分析判断长度是不是一样。然后再检查字符串中每一个相同位置上的字符是否相同。
第二、equals(Object) 方法与 "==" 相比的特殊之处就在于它可以覆盖,所以我们可以通过覆盖的办法让它不是比较引用而是比较数据内容。当然 JDK 中也有覆盖过 equals(Object) 方法的类,如 java.lang.String,它就覆盖了从 Object 继承来的的 equals(Object) 方法,用以比较字符串内容是否相同。看看下面这个例子:
public class Example1
{
public static void main(String[] args)
{
String s1=new String("abc");
String s2=new String("abc");
System.out.println("用 == 比较结果");
System.out.println(s1==s2);//false
System.out.println("用equals(Object) 比较结果");
System.out.println(s1.equals(s2));//true
}
}
例中用 equals(Object) 比较结果为 true。用 == 比较结果为 false。String.equals(Object) 方法直接比较了两个字符串的内容,如果相同则返回 true ,否则返回 false。