天天看點

Java文法----Java中equals和==的差別

【正文】

平時在學android和java語言的時候,總是碰到“equals”和“==”這兩個字元,老感覺差不多;其實還是有一些差別的,今天幹脆把它們徹底弄清楚。

一、java當中的資料類型和“==”的含義:

基本資料類型(也稱原始資料類型) :byte,short,char,int,long,float,double,boolean。他們之間的比較,應用雙等号(==),比較的是他們的值。

引用資料類型:當他們用(==)進行比較的時候,比較的是他們在記憶體中的存放位址(确切的說,是堆記憶體位址)。

注:對于第二種類型,除非是同一個new出來的對象,他們的比較後的結果為true,否則比較後結果為false。因為每new一次,都會重新開辟堆記憶體空間。

二、equals()方法介紹:

java當中所有的類都是繼承于object這個超類的,在object類中定義了一個equals的方法,equals的源碼是這樣寫的:

可以看到,這個方法的初始預設行為是比較對象的記憶體位址值,一般來說,意義不大。是以,在一些類庫當中這個方法被重寫了,如string、integer、date。在這些類當中equals有其自身的實作(一般都是用來比較對象的成員變量值是否相同),而不再是比較類在堆記憶體中的存放位址了。 

是以說,對于複合資料類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是記憶體中的存放位置的位址值,跟雙等号(==)的結果相同;如果被複寫,按照複寫的要求來。

我們對上面的兩段内容做個總結吧:

 == 的作用:

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

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

equals 的作用:

引用類型:預設情況下,比較的是位址值。

注:不過,我們可以根據情況自己重寫該方法。一般重寫都是自動生成,比較對象的成員變量值是否相同

三、string類的equals()方法:

現在我們拿string類來舉例:

我們去\src\java\lang目錄中找到string類,發現equals方法被重寫如下:

Java文法----Java中equals和==的差別
Java文法----Java中equals和==的差別

上述代碼可以看出,string類中被複寫的equals()方法其實是比較兩個字元串的内容。下面我們通過實際代碼來看看string類的比較。

1、舉例代碼如下:

Java文法----Java中equals和==的差別
Java文法----Java中equals和==的差別

上方代碼中,用“==”比較s1和s2,傳回的結果是true。

2、稍微改動一下程式,會有奇怪的發現:

Java文法----Java中equals和==的差別
Java文法----Java中equals和==的差別

 上方第4行代碼中,我們new了一個對象,用“==”比較s1和s2,傳回的結果卻是false;而用用“equals”比較s1和s2,傳回的結果是true。 

為了分析上面的代碼,我們必須首先分析堆記憶體空間和棧記憶體空間,這一點非常重要:

Java文法----Java中equals和==的差別

看完上面的圖,再結合上面的代碼,就一目了然了。現在我們可以給自己出一道面試題:

面試題:請解釋字元串比較之中“==”和equals()的差別?

 ==:比較的是兩個字元串記憶體位址(堆記憶體)的數值是否相等,屬于數值比較;

 equals():比較的是兩個字元串的内容,屬于内容比較。

以後進行字元串相等判斷的時候都使用equals()。

3、再次更改程式:

Java文法----Java中equals和==的差別
Java文法----Java中equals和==的差別

上述代碼的第5行中,java.lang.string的intern()方法"abc".intern()方法的傳回值還是字元串"abc",表面上看起來好像這個方法沒什麼用處。但實際上,它做了個小動作:檢查字元串池裡是否存在"abc"這麼一個字元串,如果存在,就傳回池裡的字元串;如果不存在,該方法會 把"abc"添加到字元串池中,然後再傳回它的引用。

四、比較兩個對象的值:

代碼如下:

Java文法----Java中equals和==的差別
Java文法----Java中equals和==的差別

上述代碼中,首先判斷傳遞進來的對象與目前對象的位址是否相等,如果相等,則肯定是同一個堆記憶體中的對象。因為傳遞進來的參數是object類型,是以任何對象都可以接收。一旦接收進來,就将object類型的對象向下轉型,然後判斷具體的屬性值。

 運作效果:

Java文法----Java中equals和==的差別

其實,如果是在eclipse中做開發的話,上面重寫的equals()方法其實是可以自動生成的:

Java文法----Java中equals和==的差別

自動生成後的equals()方法如下:

Java文法----Java中equals和==的差別
Java文法----Java中equals和==的差別

可以看到:我們自己重寫的equals()方法和自動生成的equals()方法,二者效果是一樣的。

繼續閱讀