5

人们会期望,即使字符串是不可变的,对于 Scala 中的 java.lang.String 对象,值相等和引用相等也不相同。这意味着两个 string-holding vals 不应该是引用相等的,即使它们的字符串相同。但这是我在 2.9.1.final REPL 中得到的:

scala> val s1 = "a"; val s2 = "a"
s1: java.lang.String = a
s2: java.lang.String = a

scala> s1 eq s2
res0: Boolean = true

知道为什么结果不是false吗?List("a")与而不是"a"按预期进行的相同实验。该eq方法在AnyRef中被标记为 final 。有没有专门为Stringor完成的编译器魔法java.lang.String

4

2 回答 2

13

是的,它是编译器的魔法。具体来说,它被称为实习。Java 也这样做,这只是出于效率原因,例如内存使用和允许在不比较每个字符的情况下进行比较。这是关于它的 Wikipedia 文章。您还可以使用该intern()方法手动实习字符串。

于 2012-04-09T10:56:12.420 回答
4

来自Java 语言规范

字符串文字是对类实例的引用String(第 4.3.1 节、第 4.3.3 节)。

此外,字符串字面量始终指代同一个 class 实例String。这是因为字符串文字 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用方法共享唯一实例String.intern

于 2012-04-09T11:08:25.003 回答