Kotlin-30.相等性(Equality)

官方文檔: http://kotlinlang.org/docs/reference/equality.html

1.相等性(Equality)

與java不同, Kotlin有兩種相等性equality(即兩種等號):
    1.引用Referential相等(兩個引用是否指向同一對象)
        操作符: ===(!==)
        三個等號===的比較,是比較對象引用(地址),即判斷是否同一個對象!

    2.結構Structural相等(用equals()檢查比較內容是否相等)
        操作符: ==(!=)
        兩個等號==的比較,實際是通過equals()函數進行比較判斷!

2.引用相等(Referential equality)

引用相等的操作符: ===(否定形式!==)
三個等號===的比較,是比較對象引用(地址),即判斷是否同一個對象!
    a === b //當且僅當a和b指向同一個對象時,才為true

3.結構相等(Structural equality)

結構相等的操作符: ==(否定形式!=)
兩個等號==的比較,實際是通過equals()函數進行比較判斷!
按照慣例,像a == b表達式會被翻譯成:
    //如果a不為null,則調用equals(Any?)函數,
    //否則檢查b是否與null引用相等!
    a?.equals(b) ?: (b === null)

提示: 當a == null比較時不必顯示優化代碼, a == null會被自動轉換為a === null

4.數據類的例子

數據類已自動生成equals(),所以兩個等號==(結構相等)比較的是對象數據,例如:
    data class User(val name: String, val age: Int)

    fun main(args: Array<String>) {
        val u1 = User("lioil", 1)
        val u2 = User("lioil", 1)
        val u3 = User("lioil", 2)

        println(u1 == u2)  //輸出true,  對象數據相同
        println(u1 == u3)  //輸出false, 對象數據不同

        // u1,u2,u3都是不同對象,即對象引用(地址)不同
        println(u1 === u2) //輸出false, 對象引用(地址)不同
        println(u1 === u3) //輸出false, 對象引用(地址)不同
    }

而如果User類沒有data關鍵字:
    class User(val name: String, val age: Int)
    fun main(args: Array<String>) {
        val u1 = User("lioil", 1)
        val u2 = User("lioil", 1)

        //雖然兩個對象的數據內容相同,
        //但是兩個等號==(結構相等)是通過equals()進行判斷,
        //而普通類class沒有根據屬性成員定義equals(),需要我們自己定義
        println(u1 == u2)  //輸出false           
    }

簡書:http://www.lxweimin.com/p/39dea6a4c723
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/74276269
GitHub博客:http://lioil.win/2017/07/03/Kotlin-equality.html
Coding博客:http://c.lioil.win/2017/07/03/Kotlin-equality.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容