Kotlin基礎語法之 "=="和"==="的區別
阿新 • • 發佈:2018-11-19
總體來說kotlin中==比較的是數值是否相等, 而===比較的是兩個物件的地址是否相等, 見如下程式碼:
val a: Int = 999
val b: Int? = a
val c: Int? = a
println(b == c) //true
println(b === c) //false
這個和java中執行結果是在意料之中, == 比較數值, 而===比較的是地址, 前者為true, 後者為false. 那麼看下面這段程式碼的執行情況:
val a: Int = 999
val b: Int = a
val c: Int = a
println(b == c) // true
println(b === c) // true
這段程式碼和第一段程式碼的區別就是Int和Int?的區別, 為什麼===的運算結果會不一樣呢? 不要急, 再看下面這段程式碼
val a: Int? = 999 val b: Int? = a val c: Int? = a println(b == c) //true println(b === c) //true
這段程式碼和第一段程式碼的區別就是第一行的Int?和Int的區別, 而執行出來的結果===也是true, 這是為什麼呢?
下面這個就是對上述現象的最好的解釋
注意一點: 在 java 平臺上,數值被 JVM 虛擬機器以位元組碼的方式物理儲存的,除非我們需要做可空標識(比如說 Int?) 或者涉及泛型。在後者中數值是裝箱的(參考http://www.kotlindoc.cn/Basics/Basic-Types.html 這個文章 )。
也就是說如果我們使用的是val a : Int = 999, 這種方式, 其實a就是個數值, 不涉及裝箱的問題, 也就是不是個物件, 而如果我們使用的是val a: Int? = 999, 這樣的話, a是一個Int型物件, 涉及到裝箱問題, 這樣就很好解釋為什麼第一段程式碼的===是false, 因為a是數值, 而b, c是裝箱後的物件, 而第二段程式碼a, b, c都是數值, 第三段程式碼a, b, c都是同一個物件