Kotlin里的`==`和`===`到底有啥不一樣?
作者:Reathin
1假設你和你兄弟用同款手機:用==比較:是不是同型號、同顏色、同配置?(內容一樣就算對)用===比較:是不是同一部手機?(必須是同一個物體)
舉個栗子先感受下
假設你和你兄弟用同款手機:
- 用==比較:是不是同型號、同顏色、同配置?(內容一樣就算對)
- 用===比較:是不是同一部手機?(必須是同一個物體)
這倆符號具體咋用?
==(內容相等)
- 就像查戶口:檢查對象里每個屬性值是否完全一致
- 底層原理:自動調用equals()方法(自己寫的類要重寫這個方法才有意義)
// 字符串比較(內容相同就認)
val a = "蘋果14"
val b = "蘋果" + 14
println(a == b) // true(內容一樣)
// 自定義類比較(沒重寫equals時)
class 手機(val 型號: String)
val 手機A = 手機("Mate60")
val 手機B = 手機("Mate60")
println(手機A == 手機B) // false(默認只比內存地址)
===(物理相等)
- 就像查身份證:必須是同一個對象才返回true
- 特殊福利:數字類型(比Int、Char、Boolean 等)Kotlin 會進行優化會被緩存復用,相同的值可能會指向同一個對象
// 同值不同對象
val 張三 = 手機("P70")
val 李四 = 手機("P70")
println(張三 === 李四) // false
// 特殊數字緩存
val 錢1 = 100
val 錢2 = 100
println(錢1 === 錢2) // true(在緩存范圍內)
val 大錢1 = 100000
val 大錢2 = 100000
println(大錢1 === 大錢2) // false(超出緩存)
什么時候用哪個?
用==的場合:
- 比用戶輸入的內容
- 檢查兩個訂單是否相同商品
- 驗證密碼是否正確
- 數據類(data class)自動支持內容比較
用===的場合:
- 檢查是不是同一個用戶登錄
- 單例模式驗證實例
- 發現內存泄漏時追蹤對象
- 優化性能(比如避免重復創建對象)
容易踩坑的地方
坑1:空對象比較
val 空訂單: 訂單? = null
val 另一個空訂單: 訂單? = null
println(空訂單 == 另一個空訂單) // true(都空)
println(空訂單 === 另一個空訂單) // true(都指向null)
坑2:字符串陷阱
val 名字1 = "張三"
val 名字2 = "張" + "三"
println(名字1 === 名字2) // true(編譯器優化成同一個)
val 動態名字 = StringBuilder().append("張").append("三").toString()
println(名字1 === 動態名字) // false(動態生成的地址不同)
總結
雙等號,比內容; 三等號,查身份。 基本類型看緩存, 對象比較要區分。
- 優先用==比較內容,除非確實需要判斷是否是同一個對象
- 寫數據類時直接用data class,自動幫你實現equals()
- 遇到===返回true但內容不同?檢查是否修改了可變對象
- 調試時用===快速定位對象是否被意外復用
操作符 | 名稱 | 比較內容 | Java |
== | 結構相等 | 對象內容是否相同 | equals() |
=== | 引用相等 | 是否引用同一個對象 | == |
責任編輯:武曉燕
來源:
沐雨花飛碟