1. 程式人生 > >Kotlin基礎語法之 "=="和"==="的區別

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都是同一個物件