kotlin - 为什么 Kotlin '===' 引用相等运算符对相同的对象引用返回 false?

标签 kotlin nullable equality boxing autoboxing

例子来自Kotlin官网

    val a: Int = 100
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a     

    val b: Int = 100
    val boxedB: Int? = b
    val anotherBoxedB: Int? = b

    println(a === a)  // true
    println(boxedA === anotherBoxedA) // true
    println(boxedB === anotherBoxedB) // true

我理解上面的例子。 但是当我将 ab 的值从 100 更改为 1000 时,输出更改为 true 到 false 如下所示:

    val a: Int = 1000
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a     
    
    val b: Int = 1000
    val boxedB: Int? = b
    val anotherBoxedB: Int? = b

    println(a === a)  // true
    println(boxedA === anotherBoxedA) // false
    println(boxedB === anotherBoxedB) // false

任何人都可以通过将值从 100 更改为 1000 来提供帮助,为什么 === 运算符的输出会发生变化?

自动装箱方面发生了什么?

最佳答案

自动装箱为小整数(我猜最多 127)使用缓存,因此,如果您装箱一个小整数,您会得到相同的对象,但如果您装箱一个大整数,则会得到不同的对象。

关于kotlin - 为什么 Kotlin '===' 引用相等运算符对相同的对象引用返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66085066/

相关文章:

android - 无法使用 URI 序列化对象

android - Android Studio 3.2和3.3 Canary 13中的Java编译器显示了很多警告

c# - 防止使用 null 宽容运算符

c# - 在 C# 中获取系统可空日期时间(日期时间?)的短日期

c++ - 如果 operator< 适用于浮点类型,为什么我们不能将它用于相等性测试?

Android 导航组件 - 向上导航打开相同的 fragment

java - 翻译为 Kotlin 时,我是否应该更新我的 java 文件以命名为 kotlin?

kotlin - 在不可空字段中测试驱动的最佳方法

scala - 在Scala中,有一种简洁而简单的方法来比较一个值和多个值

struct - 导出具有可变成员的 Julia 结构的相等性