Scala中java.lang.String的引用相等性

Ole*_*zov 5 string scala equality reference referenceequals

可以预料,即使字符串是不可变的,Scala中的java.lang.String对象的值相等和引用相等也不相同.这意味着val即使字符串相同,两个字符串保持也不应该是引用相等的.但这是我在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
Run Code Online (Sandbox Code Playgroud)

知道为什么结果不是false吗?相同的实验List("a")而不是"a"按预期工作.该eq方法在AnyRef中标记为final .是否有专门针对String或编译魔术java.lang.String

Lui*_*hys 13

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