1、equals的作用及與==的區別
equals被用來判斷兩個物件是否相等。
equals通常用來比較兩個物件的內容是否相等,==用來比較兩個物件的位址是否相等。
equals方法預設等同於「==」。
Object類別中的equals方法定義為判斷兩個物件的位址是否相等(可以理解成是否為同一個物件),位址相等則認為是物件相等。這也意味著,我們新建的所有類別如果沒有複寫equals方法,那麼判斷兩個物件是否相等時就等同於“==”,也就是兩個物件的位址是否相等。
Object類別中equals的方法實作如下:
public boolean equals(Object obj) { return (this == obj); }
但在我們的實際開發中,通常會認為兩個物件的內容相等時,則兩個物件相等,equals傳回true 。物件內容不同,則傳回false。
所以可以總結為兩種情況
1、類別未重寫equals方法,則使用equals方法比較兩個物件時,相當於==比較,即兩個對象的地址是否相等。位址相等,回傳true,位址不相等,回傳false。
2、類別複寫equals方法,比較兩個物件時,走複寫之後的判斷方式。通常,我們會將equals複寫成:當兩個物件內容相同時,則equals傳回true,內容不同時,傳回false。
舉個例子:
public class EqualTest { public static void main(String[] args) { Person p1 = new Person(10,"张三"); Person p2 = new Person(10,"张三"); System.out.println(p1.equals(p2)); } } class Person{ int age; String name; public Person(int age, String name) { super(); this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Person未複寫equals方法,則預設使用了Object中的equals,即為兩個物件(p1和p2)的記憶體位址判斷, p1和p2很明顯記憶體位址不同,所以輸出結果很明顯為false。
如果我們複寫equals方法呢?我們認為名字和年齡一樣的就是同一個人,那麼p1和p2都表示10歲的張三,這兩個物件應該是相等的。複寫的equals方法如下:
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }
同樣的,執行上述用例,得到的結果是true。
BTW:如果equals方法回傳true,那麼==是否也是true?
不一定是true。 equals回傳true有兩種可能,一種是兩個物件位址相同,一種是兩個物件內容相同。當內容相同時,位址可能不同,所以==比較的結果可能為false。
我們把main方法加上對==的判斷,如下:
public static void main(String[] args) { Person p1 = new Person(10,"张三"); Person p2 = new Person(10,"张三"); System.out.println(p1.equals(p2)); System.out.println(p1 == p2); }
輸出結果很明顯 p1==p2的結果是false。
推薦教學:java入門教學
以上是java如何判斷物件是否相等的詳細內容。更多資訊請關注PHP中文網其他相關文章!