【问题标题】:Kotlin boxing, Can't understand the difference? [duplicate]Kotlin 拳击,看不懂区别? [复制]
【发布时间】:2020-06-21 18:15:42
【问题描述】:
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

我不明白boexA === andotherBoxedAboexB === andotherBoxedB有什么区别

更令人困惑的是当更改 b t0 100 时输出为真

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

所以,我需要解释一下这段代码。

【问题讨论】:

标签: kotlin


【解决方案1】:

因此,作为一种优化,-128 到 127 范围内的整数值被缓存,并且任何其他对象持有与缓存的值相似的值,它将获得缓存值的引用(类似于字符串池) 所以当 val a:Int = 100 然后 val boxedA :Int? = a,所以这里发生的事情是创建了一个值为 100 的 Integer 对象,所以当 val anotherBoxedA :Int 时? = a, 某物 创建了一个对象,但是请稍等,如果它具有相同的值,即 100 并且该值在 -128 到 127 的范围内,那么 anotherBoxedA 将获得与 boxedA 相同的引用 所以当 boxedA === anotherBoxedA 会产生 true

另一方面 b=10000 大于缓存范围 (-128 : 127) 所以 boxedB = b 将创建一个新的 Integer 对象, anotherBoxedB = b 将再次创建一个新对象,因此 (boxedB === anotherBoxedB) 将产生 false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多