== 运算符
1、基本介绍
- == 运算符比较两个对象的内容是否相等,相当于 Java 的 equals 方法
2、演示
- 基本数据类型
kotlin
复制代码
val num1 = 1
val num2 = 1
val num3 = num1
println(num1 == num2)
println(num1 == num3)
复制代码
# 输出结果
true
true
- 还是基本数据类型
kotlin
复制代码
val n1 = 1000
val n2 = 1000
val n3 = n1
println(n1 == n2)
println(n1 == n3)
复制代码
# 输出结果
true
true
- 装箱的基本数据类型,在池化范围内
kotlin
复制代码
val num1: Int? = 1
val num2: Int? = 1
val num3: Int? = num1
println(num1 == num2)
println(num1 == num3)
复制代码
# 输出结果
true
true
- 装箱的基本数据类型,在池化范围内外
kotlin
复制代码
val n1: Int? = 1000
val n2: Int? = 1000
val n3: Int? = n1
println(n1 == n2)
println(n1 == n3)
复制代码
# 输出结果
true
true
- 字符串类型
kotlin
复制代码
val a = "Hello"
val b = "Hello"
val c = a
println(a == b)
println(a == c)
复制代码
# 输出结果
true
true
- 集合类型
kotlin
复制代码
val list1 = listOf(1, 2, 3)
val list2 = listOf(1, 2, 3)
val list3 = list1
println(list1 == list2)
println(list1 == list3)
复制代码
# 输出结果
true
true
=== 运算符
1、基本介绍
- === 运算符比较两个引用是否指向同一个对象实例,当于 Java 的 == 运算符
2、演示
- 基本数据类型,=== 运算符相当于 == 运算符
kotlin
复制代码
val num1 = 1
val num2 = 1
val num3 = num1
println(num1 === num2)
println(num1 === num3)
复制代码
# 输出结果
true
true
- 还是基本数据类型,=== 运算符相当于 == 运算符
kotlin
复制代码
val n1 = 1000
val n2 = 1000
val n3 = n1
println(n1 === n2)
println(n1 === n3)
复制代码
# 输出结果
true
true
- 装箱的基本数据类型,在池化范围内
kotlin
复制代码
val num1: Int? = 1
val num2: Int? = 1
val num3: Int? = num1
println(num1 === num2)
println(num1 === num3)
复制代码
# 输出结果
true
true
- 装箱的基本数据类型,在池化范围内外
kotlin
复制代码
val n1: Int? = 1000
val n2: Int? = 1000
val n3: Int? = n1
println(n1 === n2)
println(n1 === n3)
复制代码
# 输出结果
false
true
- 字符串类型,受字符串池化的影响
kotlin
复制代码
val a = "Hello"
val b = "Hello"
val c = a
println(a === b)
println(a === c)
复制代码
# 输出结果
true
true
- 集合类型
kotlin
复制代码
val list1 = listOf(1, 2, 3)
val list2 = listOf(1, 2, 3)
val list3 = list1
println(list1 === list2)
println(list1 === list3)
复制代码
# 输出结果
false
true
字符串池化的影响
1、观察记录 1
- 字面量 vs 字面量
| 比较行为 |
比较结果 |
| == 比较 |
值相等 |
| === 比较 |
引用相等,字符串池化 |
kotlin
复制代码
val a = "Hello"
val b = "Hello"
println(a == b)
println(a === b)
复制代码
# 输出结果
true
true
- 字面量 vs new String
| 比较行为 |
比较结果 |
| == 比较 |
值相等 |
| === 比较 |
引用不相等,b 是新对象 |
kotlin
复制代码
val a = "Hello"
val b = String("Hello".toCharArray())
println(a == b)
println(a === b)
复制代码
# 输出结果
true
false
- 字面量 vs 运行时拼接
| 比较行为 |
比较结果 |
| == 比较 |
值相等 |
| === 比较 |
引用不相等,运行时创建新对象 |
kotlin
复制代码
val a = "Hello"
val b_part_1 = "Hel"
val b_part_2 = "lo"
val b = b_part_1 + b_part_2
println(a == b)
println(a === b)
复制代码
# 输出结果
true
false
- 字面量 vs 编译时拼接
| 比较行为 |
比较结果 |
| == 比较 |
值相等 |
| === 比较 |
引用相等,译时优化,加入字符串池 |
kotlin
复制代码
val a = "Hello"
val b = "Hel" + "lo"
println(a == b)
println(a === b)
复制代码
# 输出结果
true
true
2、观察记录 2
- new String vs 字面量
| 比较行为 |
比较结果 |
| == 比较 |
值相等 |
| === 比较 |
引用不相等,a 是新对象 |
kotlin
复制代码
val a = String("Hello".toCharArray())
val b = "Hello"
println(a == b)
println(a === b)
复制代码
# 输出结果
true
false
- new String vs new String
| 比较行为 |
比较结果 |
| == 比较 |
值相等 |
| === 比较 |
引用不相等,两个独立对象 |
kotlin
复制代码
val a = String("Hello".toCharArray())
val b = String("Hello".toCharArray())
println(a == b)
println(a === b)
复制代码
# 输出结果
true
false
- new String vs 运行时拼接
| 比较行为 |
比较结果 |
| == 比较 |
值相等 |
| === 比较 |
引用不相等,两个独立对象 |
kotlin
复制代码
val a = String("Hello".toCharArray())
val b_part_1 = "Hel"
val b_part_2 = "lo"
val b = b_part_1 + b_part_2
println(a == b)
println(a === b)
复制代码
# 输出结果
true
false
- new String vs 编译时拼接
| 比较行为 |
比较结果 |
| == 比较 |
值相等 |
| === 比较 |
引用不相等,a 是新对象 |
kotlin
复制代码
val a = String("Hello".toCharArray())
val b = "Hel" + "lo"
println(a == b)
println(a === b)
复制代码
# 输出结果
true
false