「Java」「equals」 Chapter3 Question2
Given:
Answer:
false
false
true
當改寫 equlas 也須覆寫 hashcode, 此為必要條件.
在java裡,只有【傳值】,沒有【傳址】。不論基本型態變數或參考變數,都是複製它們的位元樣式給另一個變數。
所以當參考變數在使用==做比較時,是指兩物件是否有同時參考(指向)在heap(堆積)內的物件,也就是兩個參考變數是否存放相同的記憶體位址(位元樣式)。 如下:
----------------------------------------------------------------------
equals(Object obj) equals()是用在兩物件比較是否儲存相同的內容值,以
i1.equals(i2); 無疑地,一定是true。
因為wrapper class有實作equals,所以可用來比較兩wrapper object是否存放相同的內容值;
而String也有實作equals,所以它們在使用equals()時,沒有問題。
equals()參考變數時: 一般所產生的物件是沒有覆寫從Object繼承而來的equals(),因此當兩物件產生時,以下…
假設建構子帶入的數值是車輛,且數值一樣,其答案: False,
因為沒藉由覆寫equals()去定義,兩個Car物件在什麼條件下是相等的??
Object裡的equals()對兩物件的比較只用了==,所以其實是 car1==car2。
這兩個參考變數所產生的實體都是個別獨立存在heap裡,它們所參考的記憶體位置當然是不同的。
假如複寫equals方法:
自己定義在什麼情況下覆寫equals,兩物件比較才會相等,這裡以建構子傳入的參數值來做比較,傳入參數如果是相同的,就回傳true。
基本型態不能使用equals(),equals()只能用在物件的比較上。
最後,要搞清楚這樣的狀況…
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
留言
張貼留言