Java自學equals方法——自學筆記
Object類中的equals方法為:public boolean equals(Object object){ }
Object類中的equals()方法
Object類是所有類的父類,所以所有其他類都繼承了Object類的equals()方法。 首先說明Object類中的equals()比較的是兩個物件是否是一個物件,即兩個物件的地址是否相同,呼叫格式為a.equals(b).下面寫一個例子比較一下。
package en.edu.dlnu; public class TestEquals { public static void main(String[] args) { Student A = new Student("ZhangSan",1); Student B = new Student("LiSi",2); if(A.equals(B)){ System.out.println("YES"); }else { System.out.println("NO"); } } } class Student{ public String name; public int number; public Student(String name,int number) { this.name=name; this.number=number; } }
輸出為NO
可以看出兩個物件不等,但是因為什麼不相等呢,比較的是什麼才導致不相等呢,是比較的物件的屬性值嗎,還是物件所處的地址呢。
我們把物件的屬性值改成一樣的試一下。
package en.edu.dlnu; public class TestEquals { public static void main(String[] args) { Student A = new Student("ZhangSan",1); Student B = new Student("ZhangSan",1); if(A.equals(B)){ System.out.println("YES"); }else { System.out.println("NO"); } } } class Student{ public String name; public int number; public Student(String name,int number) { this.name=name; this.number=number; } }
這時候輸出也是NO
可以看出equals比較的不是物件的屬性值,而是比較物件的記憶體地址。
相等和同一
從以上的例子可以看出,比較兩個相等有時候會比較屬性值,有時候會比較地址值。Java中如果兩個物件具有相同的型別及相同的屬性值,責成這兩個物件相等;如果兩個引用變數指向的是同一個物件,則稱這兩個變數(物件)同一。 可以得出如果兩個物件同一,這兩個物件肯定相等;反之,如果兩個物件相等,則不一定同一。 如果用“==”來判斷兩個物件是否“相等”的時候,實際上是判斷的兩個物件是否同一。
package en.edu.dlnu; public class TestEquals { public static void main(String[] args) { Student A = new Student("ZhangSan",1); Student B = new Student("ZhangSan",1); if(A==B){ System.out.println("YES"); }else { System.out.println("NO"); } } } class Student{ public String name; public int number; public Student(String name,int number) { this.name=name; this.number=number; } }
輸出為NO
所以==判斷的是記憶體地址,也就是是否同一。
String類的equals()方法
String類中也有equals()方法,是Object類equals()方法的重寫,String類中的該方法和Object類中的該方法作用剛好相反,String類中該方法是用於判斷兩個物件屬性值是否相等。
package en.edu.dlnu;
public class TestEquals {
public static void main(String[] args) {
String A="ZhangSan";
String B="ZhangSan";
String C="LiSi";
if (A.equals(B)) {
System.out.println("是一個物件");
}else {
System.out.println("不是同一個物件");
}
if (A.equals(C)) {
System.out.println("是一個物件");
}else {
System.out.println("不是同一個物件");
}
if(A==B){
System.out.println("YES");
}else {
System.out.println("NO");
}
if(A==C){
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
輸出:是一個物件 不是同一個物件 YES NO。 對於一個String類的一個字串物件,如果兩個字串的內容相等,這兩個字串就是一個物件,所以可以看出String類中的equals()方法是用於判斷兩個字串的物件的內容是否相等。“==”在String類中還是用於判斷兩個物件是否同一的,即兩個字串記憶體地址是否一樣。
下面我們來看一下String是如何重寫的equals()方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
先判斷兩個物件的地址是否相等,地址相等即同一肯定就相等了,不然就一個字元一個字元的比較。 剩一個問題就是怎麼給字串內容相等的物件分配記憶體了。也就是==判斷的時候怎麼判斷兩個物件會分配到一個地址呢。