1. 程式人生 > >每個Java類都有的equals方法

每個Java類都有的equals方法

在Java中每個類中除非宣告繼承某個類,否則預設繼承Object類,今天就來說一下Object中一個常用的方法,equals方法

1.首先Java中equals方法比較的是兩個引用的記憶體地址,其次Java中的equals方法設計的目的是:比較兩個物件是否一樣

2.首先先來看一段程式碼:

public class Test1 {
	public static void main(String[] args){
		Object o1 = new Object();
		Object o2 = new Object();
		System.out.println(o1.equals(o2));
	}
}
這段程式的結果是false。因為兩個物件都是在堆中建立的,記憶體地址是不一樣的,所以結果是false。
3.再來看一段程式碼
public class Test1 {
	public static void main(String[] args){	
		Star s1 = new Star(100, "黃曉明");
		Star s2 = new Star(100, "黃曉明");
		
		System.out.println(s1.equals(s2));
	}
}

class Star{
	int id;
	String name;
	
	public Star(int id,String name){
		this.id = id;
		this.name = name;
	}
}
這段程式碼的結果也是false。按照之前的解釋是沒有錯誤的。但是按照業務邏輯是不符合邏輯的,只要id和name相同那就是同一個人,即使兩個物件的記憶體地址不一樣也不能影響我們的判斷,
所以我們應該重寫Object中的equals方法。
3.重寫之後的程式碼
public class Test1 {
	public static void main(String[] args){
		
		Star s1 = new Star(100, "黃曉明");
		Star s2 = new Star(100, "黃曉明");
		
		System.out.println(s1.equals(s2));
	}
}

class Star{
	int id;
	String name;
	
	public Star(int id,String name){
		this.id = id;
		this.name = name;
	}
	
	//在現實的生活中Object中的equals方法不應該比較的是記憶體地址,而應該比較實際內容,所以Object中的equals應該重寫
	public boolean equals(Object obj){
		if(this==obj){
			return true;
		}
		
		if(obj instanceof Star){
			Star s = (Star)obj;
			if(s.id==this.id && s.name.equals(name)){
				return true;
			}
		}	
		return false;
	}
	
}
重寫之後的結果是:true。沒有問題,符合邏輯。