为什么可空数字不保存身份

kotlin nullable价值观不是保存身份而是平等,

 val a: Int = 10000 val boxedA: Int? = a val anotherBoxedA: Int? = a print(boxedA === anotherBoxedA) // !!!Prints 'false'!!! print(boxedA == anotherBoxedA) // Prints 'true' 

我只是想知道为什么这是不同的?

a === b当且仅当a和b指向同一个对象时才计算为真。

boxedA === anotherBoxedA.不是这样的boxedA === anotherBoxedA.

Kotlin – 平等

这个代码示例旁边的文档中解释了这一点:

请注意,装箱数字不一定保留身份

基本上,使用可空的Int? types强制编译器在生成的字节码中使用盒装的Integertypes来代替原始的int 。 所以代码示例转换为这个Java代码:

 int a = 10000; Integer boxedA = Integer.valueOf(a); Integer anotherBoxedA = Integer.valueOf(a); System.out.print(boxedA == anotherBoxedA); 

这当然会打印false ,因为两个Integer.valueOf调用已经创建了两个不同的Integer实例。 以为JVM对Integer.valueOf调用创建的实例有缓存, 它只能在-128到127之间工作 – 如果你运行的代码有a在该范围内的值,那么这两个比较确实会返回true

引用相等意味着两个引用指向同一个对象。

Document ,通过===操作(和它的否定对象!==)检查引用相等性。 a === b当且仅当a和b指向同一个对象时才计算为真。

在科特林,我们有两个不同的平等观念, 指称平等结构平等

引用平等

我们使用===符号,它允许我们评估一个对象的引用(如果它指向同一个对象)。 这在java中是相当于“==”的运算符。 多数民众赞成为什么boxedA === anotherBoxedA返回false(因为他们是两个单独的对象,每个指向内存中的不同位置)。

结构平等

我们使用==符号来评估两个值是否相同(或相等)。 这通常是通过在java中实现equals()方法来实现的。 这就是为什么boxedA == anotherBoxedA它返回true