关于 Kotlin Int 类型装箱要注意的事情

kotlin 中,每定义一个变量,其实 kotlin 就帮我们封装了一个对象,这样可以避免空指针。

于是就有了 Int 型比较的两种方式,一种是比较“值”,一种是比较“地址”

下面这段代码,会分别输出 true 和 false

val a : Int = 10000
val a1 : Int? = a
val a2 : Int? = a
print(a1 == a2)  // == 为比较值,输出 true, 因为值相等
print(a1 === a2)  // === 为比较地址,输入 false 因为地址不同

但是如果我把 a 的值换成 5 ,这段代码的输出结果就不一样了

val a : Int = 5
val a1 : Int? = a
val a2 : Int? = a
print(a1 == a2)    //输出 true,因为值相等
print(a1 === a2)   //输出 true

我一开始也很纳闷,为什么 a 的值为 5 的时候 a1===a2 的结果会为 true,两个不同对象的地址难道不是不同的吗?

查资料后发现,kotlin 的封箱操作,相当于将基本数据类型转换成 Java 中的引用类型,即我们可以把 a1、a2 看成 Integer 类型

而关于 Integer 类型,在其源码中其实定义了一个数组,范围为 -128~127,如果我们传递的值在这个范围内,那么就会从这个数组中取值,而不会再在内存中开辟一个新地址存放我们的值,所以,才出现了我们上面 a1、a2两个不同对象的地址却一样的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高钙小新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值