----《第一季Kotlin崛起:次世代Android開發(fā) 》學(xué)習(xí)筆記
總目錄:每天學(xué)一點(diǎn) Kotlin ---- 目錄
上一篇:每天學(xué)一點(diǎn) Kotlin -- 對(duì)象進(jìn)階:異常處理
下一篇:每天學(xué)一點(diǎn) Kotlin -- 對(duì)象進(jìn)階:this 表達(dá)式
1. 引用相等和結(jié)構(gòu)(對(duì)象)相等
1.1 前者是指兩個(gè)無關(guān)聯(lián)的對(duì)象指向了 內(nèi)存中 的同一個(gè)實(shí)例侧甫。后者是指兩個(gè)對(duì)象分別位于內(nèi)存中的不同區(qū)域,但是它們的值(內(nèi)容)是相同的蹋宦。
1.2 要檢查兩個(gè)引用是否相等闺骚,用"==="或"!==";要檢查兩個(gè)對(duì)象是否相等妆档,用"=="或"!="僻爽。
1.3 舉個(gè)栗子:
(1) 栗子1
fun testEqual1() {
var file1 = File("E:/ab.txt")
var file2 = File("E:/ab.txt")
println("file1 == file2 : " + (file1 == file2))
println("file1 === file2 : " + (file1 === file2))
}
fun main(args: Array<String>) {
testEqual1()
}
打印結(jié)果:
file1 == file2 : true
file1 === file2 : false
(2)栗子1
class EqualPerson(name: String, age: Int) {
var name = name
var age = age
override fun equals(other: Any?): Boolean {
if (other != null && other is EqualPerson) {
return (this.name == other.name) && this.age == other.age
}
return false
}
}
fun testEqual2() {
val p1 = EqualPerson("xiaoMing", 20)
val p2 = EqualPerson("xiaoMing", 20)
println("p1 == p2: " + (p1 == p2))
println("p1 === p2: " + (p1 === p2))
}
fun main(args: Array<String>) {
testEqual2()
}
打印結(jié)果:
p1 == p2: true
p1 === p2: false
1.4 在不重寫 equals() 方法的情況下,比較兩個(gè)對(duì)象贾惦。 舉個(gè)栗子:
data class StudentEquals(val name: String, val age: Int)
fun testEqual3() {
val s1 = StudentEquals("s1", 20)
val s2 = StudentEquals("s2", 20)
val s3 = StudentEquals("s1", 10)
val s4 = s1
val s5 = StudentEquals("s1", 20)
println("s1 -- s2 = ${s1.equals(s2)}")
println("s1 -- s3 = ${s1.equals(s3)}")
println("s1 -- s4 = ${s1.equals(s4)}")
println("s1 -- s5 = ${s1.equals(s5)}")
}
fun main() {
testEqual3()
}
打印結(jié)果:
s1 -- s2 = false
s1 -- s3 = false
s1 -- s4 = true
s1 -- s5 = true
得出結(jié)果:兩個(gè)對(duì)象進(jìn)行 equals 比較胸梆,只要所有屬性的值相等,兩個(gè)對(duì)象就相等须板。
1.5 我的理解:
引用相等是指:兩個(gè)對(duì)象的內(nèi)容和地址相同碰镜。
對(duì)象相等是指:兩個(gè)對(duì)象的內(nèi)容相同,但是地址不同习瑰。
1.6 但是有一個(gè)特殊的類:String 類判斷兩個(gè)字符串相等有點(diǎn)特殊绪颖,如下代碼所示:
fun testEqual4() {
val s1 = "xiaoMing"
val s2 = "xiaoMing"
println("s1 == s2: ${s1 == s2}")
println("s1 === s2: ${s1 === s2}")
println("s1.equals(s2): ${s1.equals(s2)}")
}
fun main(args: Array<String>) {
testEqual4()
}
打印結(jié)果:
s1 == s2: true
s1 === s2: true
s1.equals(s2): true
出現(xiàn)這樣的結(jié)果是因?yàn)镵otlin創(chuàng)建字符串的方式是非常奇特的,為了節(jié)省空間甜奄,即便我們創(chuàng)建了兩個(gè)字符串實(shí)例柠横,如果后一個(gè)創(chuàng)建的實(shí)例的內(nèi)容和前者是一致的窃款,那么會(huì)直接指向前者的地址。對(duì)于Int牍氛,Double也是這樣的晨继。