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

时间:2012-04-09 10:50:05

标签: string scala reference equality 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

知道结果不是false的原因吗?使用List("a")代替"a"的相同实验按预期工作。 eq方法在AnyRef中标记为final。是否有专门为Stringjava.lang.String完成的编译魔术?

2 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:4)

来自Java language specification

  

字符串文字是对类String的实例的引用(§4.3.1,§4.3.3)。

     

此外,字符串文字始终引用类String 的同一实例。这是因为使用方法String.intern,字符串文字 - 或者更常见的是作为常量表达式值(第15.28节)的字符串 - 被“实现”以便共享唯一实例。