Kotlin在装箱和拆箱号码的身份上表现怪异

时间:2019-01-30 03:50:25

标签: android kotlin

在我的算法中,我一直在检查int变量和可为空的int的标识,

var literal_num: Int = 1000

var literal_num_boxed: Int? = literal_num

println("***********************************")

println((literal_num === literal_num_boxed)) //print false

println("***********************************")

但是当您将数字更改为100时,身份是相等的,我在这里做错了吗?

var literal_num: Int = 100

var literal_num_boxed: Int? = literal_num

println("***********************************")

println((literal_num === literal_num_boxed)) //true

println("***********************************")

我在kotlin文档中尝试了相同的方法。其行为也一样。检查以下图像。


enter image description here


将数字编辑为100后,它的行为方式有所不同。


enter image description here


1 个答案:

答案 0 :(得分:1)

这是因为Integer.valueOf具有缓存。

当您使用===比较int和Int?时,会发生自动装箱并调用Integer.valueOf

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

来自Integer.javalow的默认值为-128,而high的默认值为127。

发生自动装箱时,从-128到127的每个数字都将共享相同的Integer,您的结果将为true。如果数字不在该范围内,则会创建一个新的Integer,并且结果将为假。

相关设计模式:https://java-design-patterns.com/patterns/flyweight/