在kotlin
nullable
中,值不是保留身份而是保持平等,
val a: Int = 10000
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
print(boxedA == anotherBoxedA) // Prints 'true'
我只是想知道为什么会有所不同?
答案 0 :(得分:3)
答案 1 :(得分:2)
此代码示例旁边的the documentation中对此进行了解释:
请注意,数字装箱不一定保留身份
基本上,使用可空Int?
类型会强制编译器对生成的字节码中的那些变量使用加框的Integer
类型,而不是原始int
。因此代码示例转换为此Java代码:
int a = 10000;
Integer boxedA = Integer.valueOf(a);
Integer anotherBoxedA = Integer.valueOf(a);
System.out.print(boxedA == anotherBoxedA);
这当然打印false
,因为两个Integer
调用创建了两个不同的Integer.valueOf
个实例。认为JVM已缓存Integer.valueOf
调用it only works between -128 and 127创建的实例 - 如果您运行的代码a
具有该范围内的值,则两个比较都将返回{{1} }。
答案 2 :(得分:0)
引用相等意味着两个引用指向相同 对象
Document,参数相等性由===操作(及其否定对应物!==)检查。当且仅当a和b指向同一个对象时,a === b的计算结果为真。
答案 3 :(得分:0)
在kotlin中,我们有两个不同的平等概念,参考平等和结构平等
参考平等
我们使用 === 符号,它允许我们评估对象的引用(如果它指向同一个对象)。这相当于" ==" java中的运算符。这就是为什么boxedA === anotherBoxedA
返回false(因为它们是两个独立的对象,每个对象指向内存中的不同位置)。
结构平等
我们使用 == 符号来评估两个值是否相同(或相等)。这通常通过在java中实现equals()
方法来实现。
这就是boxedA == anotherBoxedA
它返回真实的原因