人们会期望,即使字符串是不可变的,Scala 中的 java.lang.String 对象的值相等和引用相等也不会相同。这意味着两个字符串持有 val
即使它们的字符串相同,s 也不应该是引用相等的。但这是我在 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 .是否有专门为 String
做的编译器魔术或 java.lang.String
?
最佳答案
是的,这是编译器的魔法。具体来说,它被称为实习。 Java 也这样做,它只是出于效率原因,例如内存使用和允许比较而不比较每个字符。这是一个 Wikipedia article on it .您还可以使用 intern()
手动实习字符串。方法。
关于string - Scala 中 java.lang.String 的引用相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10072130/