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两个不同对象的地址却一样的情况