「Java」「equals」 Chapter3 Question2

Given:
public class Test2 {
 public static void main(String [] args) {
  Test t1 = new Test(10);
  Test t2 = new Test(10);
  Test t3 = new Test(30);
  System.out.println(t1.equals(t2));
  System.out.println(t2.equals(t3));
  System.out.println(t2.equals(t2));

 }
}

class Test{
 private int a ;
 
 public Test(int aa) {
  this.a=aa;
 }
 public int hashcode() {
  return a+42;
 }
 public boolean equals(Object obj) {
  return (this==obj)?true:super.equals(obj);
 }
}

Answer:
false
false
true

當改寫 equlas 也須覆寫 hashcode, 此為必要條件.
在java裡,只有【傳值】,沒有【傳址】。不論基本型態變數或參考變數,都是複製它們的位元樣式給另一個變數
所以當參考變數在使用==做比較時,是指兩物件是否有同時參考(指向)在heap(堆積)內的物件,也就是兩個參考變數是否存放相同的記憶體位址(位元樣式)。 如下:

return (this==obj)?true:super.equals(obj);

----------------------------------------------------------------------
equals(Object obj) equals()是用在兩物件比較是否儲存相同的內容值,以
Integer i1 = new Integer(6); 

Integer i2 = new Integer(6); 

i1.equals(i2); 無疑地,一定是true。

因為wrapper class有實作equals,所以可用來比較兩wrapper object是否存放相同的內容值;

而String也有實作equals,所以它們在使用equals()時,沒有問題。

equals()參考變數時: 一般所產生的物件是沒有覆寫從Object繼承而來的equals(),因此當兩物件產生時,以下…

Car car1 = new Car(6); 

Car car2 = new Car(6);


假設建構子帶入的數值是車輛,且數值一樣,其答案: False
因為沒藉由覆寫equals()去定義,兩個Car物件在什麼條件下是相等的??
Object裡的equals()對兩物件的比較只用了==,所以其實是 car1==car2
這兩個參考變數所產生的實體都是個別獨立存在heap裡,它們所參考的記憶體位置當然是不同的。

假如複寫equals方法:

class Car{
   private String number;

     public String getNumber() {
  return number;
 }

  public boolean equals(Object obj ){
       Car car = (Car)obj;
         if(getNumber().equals(car.getNumber())){
           return true;
         }
         return false;
       }

自己定義在什麼情況下覆寫equals,兩物件比較才會相等,這裡以建構子傳入的參數值來做比較,傳入參數如果是相同的,就回傳true。

基本型態不能使用equals(),equals()只能用在物件的比較上。

最後,要搞清楚這樣的狀況…
Integer i1 = 6;
Integer i2 = 6;
Integer i3 = new Integer(6);
Integer i4 = new Integer(6);
Integer i5 = 1888;
Integer i6 = 1888;
System.out.println(i1==i2); //true
System.out.println(i3==i4);//false
System.out.println(i1==i3);//false
System.out.println(i5==i6);//false 

留言

這個網誌中的熱門文章

[Excel]國曆轉農曆VBA

「CSS」「div區塊介紹」 三欄式網頁排版設計

「生活」眉毛觀人