天天看點

"=="和equals 方法究竟有什麼差別?

思路:單獨把一個東西說清楚,然後再說清楚另一個,這樣,它們的差別自然就出來了,混在一起說,則很難說清楚

(1)==操作符專門用來比較兩個變量的值是否相等,也就是用于比較變量所對應的記憶體中所存儲的數值是否相同。要比較兩個基本類型的資料或兩個引用變量是否相等,隻能用==操作符。

         如果一個變量指向的資料是對象類型的,那麼,這時候涉及了兩塊記憶體,對象本身占用一塊記憶體(堆記憶體),變量也占用一塊記憶體,例如Objet obj = new Object();變量obj 是一個記憶體,newObject()是另一個記憶體,此時,變量obj 所對應的記憶體中存儲的數值就是對象占用的那塊記憶體的首位址。對于指向對象類型的變量,如果要比較兩個變量是否指向同一個對象,即要看這兩個變量所對應的記憶體中的數值是否相等,這時候就需要用==操作符進行比較。

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

例如,對于下面的代碼:
String a=new String("foo");
String b=new String("foo");
兩條new 語句建立了兩個對象,然後用a,b 這兩個變量分别指向了其中一個對象,這是兩個不同的對象,它們的首位址是不同的,即a 和b 中存儲的數值是不相同的,是以,表達式a==b 将傳回false,而這兩個對象中的内容是相同的,是以,表達式a.equals(b)将傳回true。

(3)在實際開發中, 我們經常要比較傳遞進行來的字元串内容是否等, 例如, String input= …;input.equals(“quit”),許多人稍不注意就使用==進行比較了,這是錯誤的,随便從網上找幾個項目實戰的教學視訊看看,裡面就有大量這樣的錯誤。記住,字元串的比較基本上都是使用equals 方法。

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

方法的實作代碼如下:

boolean equals(Object o){

return this==o;

}

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

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

==會得到同樣的結果,如果比較的是兩個獨立的對象則總傳回false。如果你編寫的類希望能夠

比較該類建立的兩個執行個體對象的内容是否相同,那麼你必須覆寫equals 方法,由你自己寫代碼

來決定在什麼情況即可認為兩個對象的内容是相同的。