区分Kotlin中的 == 和 ===

测试代码

1
2
3
4
5
6
7
8
fun main() {
val list1 = mutableListOf<String>()
val list2 = mutableListOf<String>()
list1.add("sss")
list2.add("sss")
println(list1 == list2)
println(list1 === list2)
}

测试输出

1
2
true
false

我们可以点击跳转看到,== 在kotlin中是一个被重载了的操作符合
image.png
点击跳转实现 ,等价于调用object的equals 函数
image.png
而 === 不能直接跳转。我们通过反编译成字节码再编反译成java,=== 等价于 java 中的==,比较的是地址, ==在kotlin中是Intrinsics.areEqual方法。
image.png
image.png
https://asmsupport.github.io/doc/0.4/jvmref/ref-if_acmpne.html === 等号中含有IF_ACMPNE知冷暖
image.png
方便查看,可以再反编译成java,查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static final void main() {
boolean var1 = false;
List list1 = (List)(new ArrayList());
boolean var2 = false;
List list2 = (List)(new ArrayList());
list1.add("sss");
list2.add("sss");
var2 = Intrinsics.areEqual(list1, list2);
boolean var3 = false;
System.out.println(var2);
var2 = list1 == list2;
var3 = false;
System.out.println(var2);
}

一般Intrinsics.areEqual的实现是判断内容相等,=== 判断的是地址相等

总结

在kotlin中 ,== 被重载为equals,判断的是内容相同就相等。=== 判断的是地址相等