在我的算法中,我一直在检查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文档中尝试了相同的方法。其行为也一样。检查以下图像。
将数字编辑为100后,它的行为方式有所不同。
答案 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.java
。 low
的默认值为-128,而high
的默认值为127。
发生自动装箱时,从-128到127的每个数字都将共享相同的Integer
,您的结果将为true。如果数字不在该范围内,则会创建一个新的Integer
,并且结果将为假。