官方文檔: http://kotlinlang.org/docs/reference/equality.html
1.相等性(Equality)
與java不同, Kotlin有兩種相等性equality(即兩種等號):
1.引用Referential相等(兩個引用是否指向同一對象)
操作符: ===(!==)
三個等號===的比較,是比較對象引用(地址),即判斷是否同一個對象!
2.結(jié)構(gòu)Structural相等(用equals()檢查比較內(nèi)容是否相等)
操作符: ==(!=)
兩個等號==的比較,實際是通過equals()函數(shù)進行比較判斷!
2.引用相等(Referential equality)
引用相等的操作符: ===(否定形式!==)
三個等號===的比較,是比較對象引用(地址),即判斷是否同一個對象!
a === b //當且僅當a和b指向同一個對象時,才為true
3.結(jié)構(gòu)相等(Structural equality)
結(jié)構(gòu)相等的操作符: ==(否定形式!=)
兩個等號==的比較,實際是通過equals()函數(shù)進行比較判斷!
按照慣例,像a == b表達式會被翻譯成:
//如果a不為null,則調(diào)用equals(Any?)函數(shù),
//否則檢查b是否與null引用相等!
a?.equals(b) ?: (b === null)
提示: 當a == null比較時不必顯示優(yōu)化代碼, a == null會被自動轉(zhuǎn)換為a === null
4.數(shù)據(jù)類的例子
數(shù)據(jù)類已自動生成equals(),所以兩個等號==(結(jié)構(gòu)相等)比較的是對象數(shù)據(jù),例如:
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, 對象數(shù)據(jù)相同
println(u1 == u3) //輸出false, 對象數(shù)據(jù)不同
// u1,u2,u3都是不同對象,即對象引用(地址)不同
println(u1 === u2) //輸出false, 對象引用(地址)不同
println(u1 === u3) //輸出false, 對象引用(地址)不同
}
而如果User類沒有data關(guān)鍵字:
class User(val name: String, val age: Int)
fun main(args: Array<String>) {
val u1 = User("lioil", 1)
val u2 = User("lioil", 1)
//雖然兩個對象的數(shù)據(jù)內(nèi)容相同,
//但是兩個等號==(結(jié)構(gòu)相等)是通過equals()進行判斷,
//而普通類class沒有根據(jù)屬性成員定義equals(),需要我們自己定義
println(u1 == u2) //輸出false
}
簡書:http://www.reibang.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