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
中的 ==
判断的。