天天看點

Kotlin基礎文法之 "=="和"==="的差別

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