kotlin 中的 == 和 ===

kotlin 中的 == 和 ===

其实看了很多文章,有的文章分析了一大堆,很多都在拿比较特殊的 Int 或者其他数字类型在分析,这样类型相对来说比较复杂,不好分析。

下面先说结论:

  • == 相当于 java 中的调用 equals 方法。比较两个引用的相等性或者等同性。
  • === 相当于 java 中的 ==。比较两个引用的同一性。

这里普及一下,等同性是指两个对象的是不是相等的,也就是调用 equals 方法,检查对象的内容是否相等,而同一性指定是比较两个引用是否指向相同的对象(或者地址)。

分析,下面的代码利用了两个普通的对象来分析的:

fun main() {
    val s1 = Student("012345", "张三", 18, '男')
    val s2 = Student("012345", "张三", 18, '男')
    println("s1 == s2: " + (s1 == s2))      // true
    println("s1 === s2: " + (s1 === s2))    // false

    /**
     * Student s1 = new Student("012345", "张三", 18, '男');
     * Student s2 = new Student("012345", "张三", 18, '男');
     * // Intrinsics.areEqual(s1, s2) 这个是一个安全的比较
     * String var2 = "s1 == s2: " + Intrinsics.areEqual(s1, s2);
     * System.out.println(var2);
     * var2 = "s1 === s2: " + (s1 == s2);
     * System.out.println(var2);
     */
}

/**
 * 一个普通的 java bean
 */
class Student(
    val number: String,
    val name: String,
    val age: Int,
    val sex: Char
) {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as Student

        if (number != other.number) return false
        if (name != other.name) return false
        if (age != other.age) return false
        if (sex != other.sex) return false

        return true
    }

    override fun hashCode(): Int {
        var result = number.hashCode()
        result = 31 * result + name.hashCode()
        result = 31 * result + age
        result = 31 * result + sex.hashCode()
        return result
    }
}

其中的 equalshashCode 方法都是自己生成的,代码注释中是截取了反编译后的核心代码。其中可以看到有一个 ntrinsics.areEqual(s1, s2),下面看看这个方法的源码:

public static boolean areEqual(Object first, Object second) {
    return first == null ? second == null : first.equals(second);
}

这个是一个安全的 equals,不会抛出 NullPointeException 异常。

从上面的反编译的源码可以看到 ==是调用了 equals 方法,而 === 是直接利用 java 中的 == 判断的。

你可能感兴趣的:(kotlin 中的 == 和 ===)