val a: Int = 100
val boxedA: Int? = a
val anotherBoxedA: Int? = a
val b: Int = 10000
val boxedB: Int? = b
val anotherBoxedB: Int? = b
println(boxedA === anotherBoxedA) // true
println(boxedB === anotherBoxedB) // false
Run Code Online (Sandbox Code Playgroud)
boexA === andotherBoxedA我不明白的是和之间有什么区别boexB === andotherBoxedB
更令人困惑的是,当更改 b t0 100 时,输出为 true true
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(boxedA === anotherBoxedA) // true
println(boxedB === anotherBoxedB) // true
Run Code Online (Sandbox Code Playgroud)
所以,我需要对此代码的解释。
因此,作为一种优化,-128 到 127 范围内的整数值被缓存,并且任何其他对象保存与缓存的值相似的值,它将获得缓存值的引用(类似于字符串池),因此当 val a:Int = 100 且然后 val boxedA :Int? = a,所以这里发生的是一个值为 100 的 Integer 对象被创建,所以当 val anotherBoxedA :Int? = a,一个对象被创建的东西,但是等等,如果它保存相同的值,即 100 并且该值在 -128 到 127 范围内,那么 anotherBoxedA 将获得与 boxedA 相同的引用,所以当 boxedA === anotherBoxedA 时产生真实的
另一方面,b=10000 大于缓存范围 (-128 : 127),因此 boxedB = b 将创建一个新的 Integer 对象,anotherBoxedB = b 将再次创建一个新对象,因此 (boxedB === anotherBoxedB) 将产生假
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |