如何解释这些关于“Int”types的Kotlin代码?

var a: Int = 10000 var b: Int = 10000 print(b === a) // Prints 'true' 

官方的文件说:“a === b评估为真,当且仅当a和b指向相同的对象。”

在上面的代码中,什么是“同一个对象”?

数据如何存储

如果你想象一下JVM里面有两种直接存储的types:

  • 原始types[ IntLong ]

    这些被存储为值

  • 引用types[ StringObject ]

    这些被存储为对象的引用

===如何工作

===比较内存中的值,因此对于引用types,它检查它们是否指向同一个对象,而对于基元types,它会检查它们是否保持相同的值。

为什么是Int的原始对象

Kotlin存储可以作为基元存储为基元的types作为优化,所以Int是原始的,而Int? 将被存储为参考types。

===意味着我们必须检查对象之间的参照平等。

 var a: Int = 10000 var b: Int = 10000 print(b === a) 

它打印真实的,因为对abvariables的引用是相同的。 这实际上不是一个对象。 由于ab的值相同,所以它们的引用也是相同的。 ab指的是相同的内存分配,因为它们的值是相同的。 ab是原始typesvariables。 所以,你会得到一个警告

Int和Inttypes参数的标识符相等已被弃用。

 var c = Integer(10000) var d = Integer(10000) print(d === c) 

它打印false,因为cd是两个不同的Integer对象。 所以,对cd的引用也是不同的。

您需要知道正常的Int值表示为JVM基元inttypes。 你也可以写:

 print(10000 === 10000) // Prints 'true