如何解释这些关于“Int”types的Kotlin代码?
var a: Int = 10000 var b: Int = 10000 print(b === a) // Prints 'true'
官方的文件说:“a === b评估为真,当且仅当a和b指向相同的对象。”
在上面的代码中,什么是“同一个对象”?
数据如何存储
如果你想象一下JVM里面有两种直接存储的types:
-
原始types[
Int
,Long
]这些被存储为值
-
引用types[
String
,Object
]这些被存储为对象的引用
===
如何工作
===
比较内存中的值,因此对于引用types,它检查它们是否指向同一个对象,而对于基元types,它会检查它们是否保持相同的值。
为什么是Int
的原始对象
Kotlin存储可以作为基元存储为基元的types作为优化,所以Int
是原始的,而Int?
将被存储为参考types。
===
意味着我们必须检查对象之间的参照平等。
var a: Int = 10000 var b: Int = 10000 print(b === a)
它打印真实的,因为对a
和b
variables的引用是相同的。 这实际上不是一个对象。 由于a
和b
的值相同,所以它们的引用也是相同的。 a
和b
指的是相同的内存分配,因为它们的值是相同的。 a
和b
是原始typesvariables。 所以,你会得到一个警告
Int和Inttypes参数的标识符相等已被弃用。
var c = Integer(10000) var d = Integer(10000) print(d === c)
它打印false,因为c
和d
是两个不同的Integer对象。 所以,对c
和d
的引用也是不同的。
您需要知道正常的Int
值表示为JVM基元int
types。 你也可以写:
print(10000 === 10000) // Prints 'true