在Java中,我們常常會用到兩個運算符來比較兩個對象是否相等,即“==”和“equal()”方法。雖然它們的作用類似,但在使用時卻需要注意兩者之間的區別。
// 示例1 String a = "hello"; String b = "hello"; System.out.println(a == b); // true System.out.println(a.equal(b)); // true // 示例2 String c = new String("hello"); String d = new String("hello"); System.out.println(c == d); // false System.out.println(c.equal(d)); // true
首先,使用“==”運算符來比較兩個對象的時候,它所比較的是這兩個對象的地址是否相等。也就是說,如果這兩個對象的地址相同,那么它們引用的是同一個對象,此時“==”就會返回true;反之,如果它們引用的是不同的對象,即使它們具有相同的內容,也會返回false。
但是,在使用“equal()”方法時,它比較的是兩個對象的內容是否相同。為了方便理解,我們可以將它們的內容看作是一樣的,只是它們占用的空間不同。當這兩個對象所表示的內容一致時,它們的“equal()”方法返回true。
有兩個需要特別注意的地方:
- 如果一個對象未重寫“equal()”方法,那么采用的是父類Object的比較方法,也就是和“==”一樣判斷地址是否相同
- “equal()”方法比較內容是否相等時,由于其是JDK庫中定義的方法,因此不同的類所實現的邏輯也會不同。例如,String類會比較字符串內容是否相同,而Integer類,則會比較Number類型的值是否相等。因此,在使用“equal()”方法時,必須要重寫該方法,以保證所比較的內容是相近的,而不是基于地址來判斷