美文网首页
每天学一点 Kotlin -- 对象进阶:对象比较

每天学一点 Kotlin -- 对象进阶:对象比较

作者: 冯可乐同学 | 来源:发表于2021-12-02 10:12 被阅读0次

----《第一季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也是这样的。

相关代码:https://gitee.com/fzq.com/test-demo

相关文章

网友评论

      本文标题:每天学一点 Kotlin -- 对象进阶:对象比较

      本文链接:https://www.haomeiwen.com/subject/fsytaltx.html