美文网首页
每天学一点 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