總體來說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都是同一個對象