2016-01-20 41 views
1

我曾經使用表達obj != null無數次。有時我使用null == obj使用「==」與null進行比較安全嗎?

我剛剛讀過一塊scala標準庫資源,發現obj eq null是唯一用於比較的形式。

使用運算符(即.equals的糖)是否可以安全地比較null的版本?可能有些隱式魔法粉碎與==版本的正常比較邏輯?

回答

1

您可以隨時使用==的對象比較,和空值會必要時安全使用eq而不是equals

scaladoc==

測試相等的兩個對象。表達式x == that相當於if (x eq null) that eq null else x.equals(that)

所以,如果你有val s: String = null,你檢查s == null,然後s eq null是真實的,所以if是真實的,它返回null eq null,這也是事實。

事實上,使用==總是比使用equals更安全,因爲你可能實際調用s.equals(s)(其中snull),這將拋出NPE。

+0

但它仍可能被重新定義。 – ayvango

+0

@ayvango'=='是'final',所以不,它不能。 –

+0

最後還是不錯的。它允許優化多餘的比較,如果在左邊寫'null':'null。==(obj)' – ayvango

0

是的。

在Scala中,==要優於equals,因爲它處理null並意識到數字等價(1==1L!1.equals(1L)

如果你想引用相等,運用EQ。

+0

但是scala庫不使用'=='。它使用'eq' – ayvango

+0

''eq''用於參考相等。 –

+0

我知道。有沒有什麼理由我應該更喜歡'eq'來進行空比較? – ayvango

1

是的, 我補充一下: 如果你加快你的程序,使用

null == ptr 

該程序可以編譯更快

相關問題