天天看點

Set 裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用==還 是 equals()?它們有何差別?

Set 裡的元素是不能重複的,元素重複與否是使用 equals()方法進行判斷的。

equals()和==方法決定引用值是否指向同一對象 equals()在類中被覆寫,為的是當兩個

分離的對象的内容和類型相配的話,傳回真值。

equals()和==的差別

==操作符專門用來比較兩個變量的值是否相等,也就是用于比較變量所對應的記憶體中所存

儲的數值是否相同, 要比較兩個基本類型的資料或兩個引用變量是否相等,隻能用==操作

符。

如果一個變量指向的資料是對象類型的,那麼,這時候涉及了兩塊記憶體, 對象本身占用一塊

記憶體(堆記憶體),變量也占用一塊記憶體,例如 Objet obj = new Object();變量 obj 是一個記憶體,

new Object()是另一個記憶體,此時,變量 obj 所對應的記憶體中存儲的數值就是對象占用的那

塊記憶體的首位址。對于指向對象類型的變量,如果要比較兩個變量是否指向同一個對象,即

要看這兩個變量所對應的記憶體中的數值是否相等,這時候就需要用==操作符進行比較。

equals 方法是用于比較兩個獨立對象的内容是否相同,就好比去比較兩個人的長相是否相

同,它比較的兩個對象是獨立的。例如,對于下面的代碼:

String a=new String("foo");
String b=new String("foo");      

兩條 new 語句建立了兩個對象,然後用 a/b 這兩個變量分别指向了其中一個對象,這是兩

個不同的對象,它們的首位址是不同的,即 a 和 b 中存儲的數值是不相同的,是以,表達

式 a==b 将傳回 false,而這兩個對象中的内容是相同的,是以,表達式 a.equals(b)将傳回

true。

在實際開發中,我們經常要比較傳遞進行來的字元串内容是否等,例如, String input

= …;input.equals(“quit”),許多人稍不注意就使用==進行比較了,這是錯誤的,随便從網上

找幾個項目實戰的教學視訊看看,裡面就有大量這樣的錯誤。記住,字元串的比較基本上都

是使用 equals 方法。

如果一個類沒有自己定義 equals 方法,那麼它将繼承 Object 類的 equals 方法, Object 類

的 equals 方法的實作代碼如下:

boolean equals(Object o){
return this==o;
}      

這說明,如果一個類沒有自己定義 equals 方法,它預設的 equals 方法(從 Object 類繼承

的)就是使用==操作符,也是在比較兩個變量指向的對象是否是同一對象,這時候使用

equals 和使用==會得到同樣的結果,如果比較的是兩個獨立的對象則總傳回 false。如果你

編寫的類希望能夠比較該類建立的兩個執行個體對象的内容是否相同,那麼你必須覆寫 equals

方法,由你自己寫代碼來決定在什麼情況即可認為兩個對象的内容是相同的 

由上述可見:

總結如下:

==:

  基本類型:比較的是值是否相同

  引用類型:比較的是位址值是否相同

equals():

  引用類型:預設情況下,比較的是位址值,可進行重寫,比較的是對象的成員變量值是否相同

String a=new String("foo");
String b=new String("foo");      
boolean equals(Object o){
return this==o;
}