val hello1 = "hello"
val hello2 = "hello"
printf(hello1 === hello2)
为什么打印真实?
我猜kotlin有一个原始类型池(或类似的东西)。 如果值是相等的,则指针指向同一个地方。我不确定。
答案 0 :(得分:5)
Kotlin只是重复使用相同的机制。有关其他说明,请参阅Is String Literal Pool a collection of references to the String Object, Or a collection of Objects和Java String literal pool and string object。
答案 1 :(得分:2)
我在this answer中解释了Kotlin中使用的一般平等工具。 TLDR:
结构平等:==
编译为Java的equals
引用相等:===
是==
在Java中的作用:引用相互比较。如果正在比较相同的对象,则会产生true
。
字符串的特殊之处在于它们可以使用所谓的字符串常量池。例如,即使在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'
在此处阅读:What is the Java string pool and how is "s" different from new String("s")?
仅供参考:String
s不是原始的。
答案 2 :(得分:1)
https://kotlinlang.org/docs/reference/equality.html
在Kotlin中有两种类型的平等:
- 参照等式(两个引用指向同一个对象);
- 结构相等(检查等于())。
参照等式由
===
操作(及其否定的对应!==
)检查。当且仅当a === b
评估为真 a和b指向同一个对象。结构相等性由
==
操作(及其否定的对应!=
)检查。按照惯例,像a == b
这样的表达式 翻译为:所以你看
a?.equals(b) ?: (b === null)
所以你看到:==
表示equals
,===
表示参照平等
这意味着
val hello1 = "hello"
val hello2 = "hello"
printf(hello1 === hello2)
是参考比较,应该导致false
。
但是:当您使用像"hello"
这样的字符串文字时,会使用java的字符串缓存(这是一种节省内存的优化)。所以你得到两次相同的引用,因此引用相等是真的。