每個Java類都有的equals方法
阿新 • • 發佈:2019-01-24
在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.重寫之後的程式碼
重寫之後的結果是:true。沒有問題,符合邏輯。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; } }