1. 程式人生 > 其它 >Scala與Java中==與equals用法總結

Scala與Java中==與equals用法總結

在Java和Scala語言中,==和equals的用法是略有不同的,如果不對比學習,容易產生困惑,現在來對比總結。

一、Java當中的資料型別和“==”的含義:

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

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

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

二、Java中equals()方法介紹:

JAVA當中所有的類都是繼承於Object這個超類的,在Object類中定義了一個equals的方法,equals的原始碼是這樣寫的:

public boolean equals(Object obj) {

//this - s1

//obj - s2

return (this == obj);

}

可以看到,這個方法的初始預設行為是比較物件的記憶體地址值,一般來說,意義不大。所以,在一些類庫當中這個方法被重寫了,如String、Integer、Date。在這些類當中equals有其自身的實現(一般都是用來比較物件的成員變數值是否相同),而不再是比較類在堆記憶體中的存放地址了。

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

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

== 的作用:

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

  引用型別:比較的就是地址值是否相同

equals 的作用:

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

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

在Scala中對於==和equals方法的使用有所不同,==的實現很用心,當呼叫==操作符時,會首先檢查左側是否為null,若不為null,則呼叫equals方法,而呼叫的equals方法的具體比較邏輯,則取決於左側引數的型別,對於基礎資料型別以及String型別來說,equals方法的邏輯主要為比較兩者的值是否相等。所以在Scala中,當你呼叫==或者equals方法時,更多的得到是二者的值是否相等(除非你比較的物件型別重寫了equals方法,實現了自己的比較邏輯),而且很明顯使用==比equals更安全,因為==會首先確認左側物件是否為null,避免了空指標異常。如果你想比較兩個物件的引用是否相等,Scala為使用者提供了eq方法。總結如下:

==、equals的作用:

比較值相等性,==會首先判斷左側物件是否為null,然後呼叫物件型別的equals方法,更安全。

Eq方法的作用:

比較引用相等性。