1. 程式人生 > >Java自學equals方法——自學筆記

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;
    }

先判斷兩個物件的地址是否相等,地址相等即同一肯定就相等了,不然就一個字元一個字元的比較。 剩一個問題就是怎麼給字串內容相等的物件分配記憶體了。也就是==判斷的時候怎麼判斷兩個物件會分配到一個地址呢。