在kotlin
nullable
价值观中不是保持身份而是平等:
val a: Int = 10000
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
print(boxedA == anotherBoxedA) // Prints 'true'
为什么这不同?
在kotlin
nullable
价值观中不是保持身份而是平等:
val a: Int = 10000
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
print(boxedA == anotherBoxedA) // Prints 'true'
为什么这不同?
此代码示例旁边的文档对此进行了说明:
请注意,数字装箱不一定能保持身份
基本上,使用可空Int?
类型会强制编译器对Integer
生成的字节码中的那些变量使用装箱类型,而不是原始类型int
。因此,代码示例转换为以下 Java 代码:
int a = 10000;
Integer boxedA = Integer.valueOf(a);
Integer anotherBoxedA = Integer.valueOf(a);
System.out.print(boxedA == anotherBoxedA);
这当然会打印,因为这两个调用创建了false
两个不同的实例。以为 JVM 对调用创建的实例有缓存,它只在 -128 和 127 之间工作——如果你运行代码时具有该范围内的值,那么两个比较确实都会返回。Integer
Integer.valueOf
Integer.valueOf
a
true
引用相等意味着两个引用指向同一个对象。
Document,引用相等性由 === 操作(及其否定的对应物!==)检查。a === b 当且仅当 a 和 b 指向同一个对象时才计算为 true。
在 kotlin 中,我们有两个不同的相等概念,引用相等和结构相等
参照平等
我们使用===符号,它允许我们评估对象的引用(如果它指向同一个对象)。这相当于java中的“==”运算符。这就是为什么boxedA === anotherBoxedA
返回 false(因为它们是两个独立的对象,每个都指向内存中的不同位置)。
结构平等
我们使用==符号来评估两个值是否相同(或相等)。这通常是通过equals()
在java中实现方法来实现的。这就是boxedA == anotherBoxedA
它返回 true的原因