为什么kotlin使用===如果基本类型的值相同,则比较原始类型
val hello1 = "hello" val hello2 = "hello" printf(hello1 === hello2)
为什么打印真实?
我猜kotlin有一个原始类型池(或类似的东西)。 如果值是平等的,指针指向同一个地方。我不确定。
平等在Kotlin
我已经在这个答案中解释了Kotlin的平等理解。 简单地说:
-
结构相等:
==
被编译为Java的equals
和===
-
引用相等:
===
是什么==
在Java中:引用是相互比较的。 如果相同的对象被比较,这是真的。
如你的例子中的字符串呢?
字符串是特殊的,他们使用一个所谓的字符串常量池 。 例如,即使在Java中,两种比较都是true
:
public static void main(String[] args) { String s = "prasad"; String s2 = "prasad"; System.out.println(s.equals(s2)); System.out.println(s == s2); }
另一方面,这个片段确实有所不同,因为正在创建new
字符串:
String foo = new String("hello"); String bar = new String("hello"); System.out.println(foo == bar); // prints 'false'
在这里阅读: 什么是Java字符串池,“s”与新的String(“s”)有什么不同?
FYI: String
不是原始的。
一个字符串文字总是引用类String的同一个实例。 这是因为字符串文字 – 或者更一般地说,是常量表达式(§15.28)的值的字符串 – 被“interned”,以便使用方法String.intern共享唯一的实例。
科特林只是重复使用相同的机制。 请参阅字符串文字池以获取对字符串对象的引用的集合,或者获取对象和Java字符串文字池和字符串对象 的集合以获取更多解释。
https://kotlinlang.org/docs/reference/equality.html
在科特林,有两种平等:
- 引用相等(两个引用指向同一个对象);
- 结构平等(检查等于())。
引用相等是通过
===
操作(和它的否定对象!==
)检查的。a === b
当且仅当a和b指向同一个对象时才计算为真。结构相等性由
==
操作(及其否定的对应!=
)检查。 按照惯例,像a == b
这样的表达式被翻译成:所以你看
a?.equals(b) ?: (b === null)
所以你看: ==
意味着equals
和===
意味着参照平等
这将意味着这一点
val hello1 = "hello" val hello2 = "hello" printf(hello1 === hello2)
是比较哪个应该导致false
参照。 但是:当你使用像"hello"
这样的字符串文字时,会使用java的字符串缓存(这是一个优化来节省内存)。 所以你得到两个相同的参考,因此参考平等是真实的。