为什么kotlin使用===如果基本types的值相同,则比较原始types

val hello1 = "hello" val hello2 = "hello" printf(hello1 === hello2) 

为什么打印真实?

我猜kotlin有一个原始types池(或类似的东西)。 如果值是平等的,指针指向同一个地方。我不确定。

平等在Kotlin

我已经在这个答案中解释了Kotlin的平等理解。 简而言之:

  1. 结构相等: ==被编译为Java的equals===

  2. 引用相等: ===是什么==在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的同一个实例。 这是因为字符串文字 – 或者更一般地说,是常量expression式(§15.28)的值的字符串 – 被“interned”,以便使用方法String.intern共享唯一的实例。

科特林只是重复使用相同的机制。 请参阅字符串文字池以获取对字符串对象的引用的集合,或者获取对象和Java字符串文字池和字符串对象 的集合以获取更多解释。

https://kotlinlang.org/docs/reference/equality.html

在科特林,有两种平等:

  • 引用相等(两个引用指向同一个对象);
  • 结构平等(检查等于())。

引用相等是通过===操作(和它的否定对象!== )检查的。 a === b当且仅当a和b指向同一个对象时才计算为真。

结构相等性由==操作(及其否定的对应!= )检查。 按照惯例,像a == b这样的expression式被翻译为:所以你看

 a?.equals(b) ?: (b === null) 

所以你看: ==意味着equals===意味着参照平等

这将意味着这一点

 val hello1 = "hello" val hello2 = "hello" printf(hello1 === hello2) 

是比较哪个应该导致false参照。 但是:当你使用像"hello"这样的字符串文字时,会使用java的字符串缓存(这是一个优化来节省内存)。 所以你得到两个相同的参考,因此参考平等是真实的。