----《第一季Kotlin崛起:次世代Android开发 》学习笔记
总目录:每天学一点 Kotlin ---- 目录
上一篇:每天学一点 Kotlin -- 对象进阶:异常处理
下一篇:每天学一点 Kotlin -- 对象进阶:this 表达式
1. 引用相等和结构(对象)相等
1.1 前者是指两个无关联的对象指向了 内存中 的同一个实例。后者是指两个对象分别位于内存中的不同区域,但是它们的值(内容)是相同的。
1.2 要检查两个引用是否相等,用"==="或"!==";要检查两个对象是否相等,用"=="或"!="。
1.3 举个栗子:
(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()
}
打印结果:
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()
}
打印结果:
p1 == p2: true
p1 === p2: false
1.4 在不重写 equals() 方法的情况下,比较两个对象。 举个栗子:
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()
}
打印结果:
s1 -- s2 = false
s1 -- s3 = false
s1 -- s4 = true
s1 -- s5 = true
得出结果:两个对象进行 equals 比较,只要所有属性的值相等,两个对象就相等。
1.5 我的理解:
引用相等是指:两个对象的内容和地址相同。
对象相等是指:两个对象的内容相同,但是地址不同。
1.6 但是有一个特殊的类:String 类判断两个字符串相等有点特殊,如下代码所示:
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()
}
打印结果:
s1 == s2: true
s1 === s2: true
s1.equals(s2): true
出现这样的结果是因为Kotlin创建字符串的方式是非常奇特的,为了节省空间,即便我们创建了两个字符串实例,如果后一个创建的实例的内容和前者是一致的,那么会直接指向前者的地址。对于Int,Double也是这样的。