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
    }
}
其中的 equals 和 hashCode 方法都是自己生成的,代码注释中是截取了反编译后的核心代码。其中可以看到有一个 ntrinsics.areEqual(s1, s2),下面看看这个方法的源码:
public static boolean areEqual(Object first, Object second) {
    return first == null ? second == null : first.equals(second);
}
这个是一个安全的 equals,不会抛出 NullPointeException 异常。
从上面的反编译的源码可以看到 ==是调用了 equals 方法,而 === 是直接利用 java 中的 == 判断的。










