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

标签 string scala reference equality referenceequals

人们会期望,即使字符串是不可变的,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/

相关文章:

string - 如何处理字符串数组?

Ruby String#scan 相当于返回 MatchData

scala - 无法在线安装 sbt(按照官方指南)

ios - 如何从 Sprite Kit 场景中引用当前的 Viewcontroller

javascript - 没有引用 DOM 对象

java - 删除字符串中2个字符之间的所有字符

python - 如何根据条件python查找字符串中字母的位置

Scala 匿名函数语法

在 trait 中定义的 Scala 尾递归流处理器函数保存对流头的引用

c++ - 为什么两种乐趣都返回相同?