揭秘 Kotlin 中的 == 和 ===
- 如果评论区没有及时回复,欢迎来公众号:ByteCode 咨询
- 公众号:ByteCode。致力于分享最新技术原创文章,涉及 Kotlin、Jetpack、算法、译文、系统源码相关的文章
之前分别写了三篇文章,从原理、优化、实战、新特性(密封接口)以不同的角度分别介绍了 Sealed Classes。
全文分为 视频版 和 文字版,
视频版:
通过语音和动画,能够更加直观的到完成过程。
文字版
而这篇文章我们主要来分析 Kotlin 中的操作符 ==
和 ===
的区别,以及它们分别在什么场景下使用。这些操作符在实际项目和开源项目中,使用的频率非常的高。主要包含以下内容:
- Java 中的
==
和equals
的区别? - Kotlin 提供的操作符
==
和===
分别做什么用?- 比较对象的结构是否相等 (
==
或者equals
) - 比较对象的引用是否相等 (
===
)
- 比较对象的结构是否相等 (
- Kotlin 中的操作符在以下场景中的使用
- 基本数据类型
- 包装类
- 普通类
- 数据类
在开始分析之前,我们先来简单回顾一下 Java 中的操作符 ==
和 equals
的区别。
Java 中的操作符 == 和 equals 的区别
操作符 ==
- 如果是基本数据类型比较的是值
- 如果是引用数据类型比较的是地址
操作符 equals
- 默认情况下在不重写
equals
方法时,等价于==
,比较的是地址
public boolean equals(Object obj) { |
- 重写
equals
方法时,一般用于比较结构是否相等,例如String
public boolean equals(Object anObject) { |
但是需要注意的是重写 equals
方法时,需要重写 hashCode()
方法,否则无法和 hash 集合类一起正常工作,可以通过快捷键自动生成 equals()
、hashCode()
、 toString()
等等方法。
- Mac: Cmd + N
- Win/Linux: Alt+Insert
更多 AndroidStudio 快捷键使用技巧查看下列文章:
关于 Java 的操作符介绍就到这里了,接下来重点来分析 Kotlin 中的操作符。
Kotlin 中的操作符 == 和 === 及 equals
Kotlin 提供了两种方式用于对象的比较。
比较对象的结构是否相等(
==
或者equals
)Kotlin 中的操作符
==
等价于equals
用于比较对象的结构是否相等, 很多情况下使用的是==
,因为对于浮点类型 Float 和 Double,其实现方法equals
不遵循 IEEE 754 浮点运算标准。比较对象的引用是否相等 (
===
)Kotlin 中的操作符
===
用于比较对象的引用是否指向同一个对象,运行时如果是基本数据类型===
等价于==
。
我们知道了基本概念之后,接下来一起来看一下这些操作符( ==
和 ===
及 equals
),在以下场景中的使用。
- 基本数据类型
- 包装类
- 普通类
- 数据类
基本数据类型
我们先来看一个例子:
val a1 = -0 |
运行时,对于基本数据类型 ===
等价于 ==
比较的是值(即对象的结构是否相等),如果比较基本数据类型时使用 ===
,编译器就会给出一个警告,不建议使用。
但是 equals
比较特殊, 对于浮点类型 Float 和 Double 却有不同的表现,代码如下所示。
val a3 = -0f |
float a3 = -0.0F;
float a4 = 0.0F;
boolean var2 = Float.valueOf(a3).equals(a4);
boolean var3 = false;
System.out.println(var2);
|
System.out.println(Float.floatToIntBits(-0f)); // -2147483648
System.out.println(Float.floatToIntBits(0f)); // 0
|
val a5 = Integer(10)
val a6 = Integer(10)
println(a5 == a6) // true
println(a5.equals(a6)) // true
println(a5 === a6) // false
|
class Person1(val name: String, val age: Int)
val p1 = Person1(name = “hi-dhl”, age = 10)
val p2 = Person1(name = “hi-dhl”, age = 10)
println(p1 == p2) // false
println(p1.equals(p2)) // false
println(p1 === p2) // false
println(p1.name == p2.name) // true
println(p1.name.equals(p2.name)) // true
println(p1.name === p2.name) // true
|
data class Person2(val name: String, val age: Int)
val p3 = Person2(name = “ByteCode”, age = 10)
val p4 = Person2(name = “ByteCode”, age = 10)
println(p3 == p4) // true
println(p3.equals(p4)) // true
println(p3 === p4) // false
println(p3.name == p4.name) // true
println(p3.name.equals(p4.name))// true
println(p3.name === p4.name) // true
|
public int hashCode() {
String var10000 = this.name;
return (var10000 != null ? var10000.hashCode() : 0) * 31 + Integer.hashCode(this.age);
}
public boolean equals(@Nullable Object var1) {
if (this != var1) {
if (var1 instanceof Person2) {
Person2 var2 = (Person2)var1;
if (Intrinsics.areEqual(this.name, var2.name) && this.age == var2.age) {
return true;
}
}
return false;
} else {
return true;
}
}
|
class Person1(val name: String, val age: Int)
data class Person2(val name: String, val age: Int)
fun main() {
val a1 = -0
val a2 = 0
println(a1 == a2)
println(a1.equals(a2)
val a3 = -0f
val a4 = 0f
println(a3 == a4)
println(a3.equals(a4))
//-------------
val p1 = Person1(name = "hi-dhl", age = 10)
val p2 = Person1(name = "hi-dhl", age = 10)
println(p1 == p2)
println(p1.equals(p2))
println(p1 === p2)
println(p1.name === p2.name)
//-------------
val p3 = Person2(name = "ByteCode", age = 10)
val p4 = Person2(name = "ByteCode", age = 10)
println(p3 == p4)
println(p3.equals(p4))
println(p3 === p4)
println(p3.name === p4.name)
}
|
a1 == a2 true
a1.equals(a2) true
a3 == a4 true
a3.equals(a4) false
p1 == p2 false
p1.equals(p2) false
p1 === p2 false
p1.name === p2.name true
p3 == p4 true
p3.equals(p4) true
p3 === p4) false
p3.name === p4.name true
<p align="center">
<br/>
<p align="center"><b>如果有帮助 点个赞 就是对我最大的鼓励</b></p>
<p align="center"><b>代码不止,文章不停</b></p>
<p align="center"><b>欢迎关注公众号:ByteCode,持续分享最新的技术</b></p>
<br/>
</p>
- 本文作者:hi-dhl
- 本文标题:揭秘 Kotlin 中的 == 和 ===
- 本文链接:https://hi-dhl.com/2021/07/14/kotlin/10-kotlin-equality/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 hi-dhl