Scala中java.lang.String的引用相等
人们可能会认为,即使字符串是不可变的,Scala中java.lang.String对象的值相等和引用相等也不相同。这意味着,两个包含Scala中java.lang.String的引用相等,string,scala,reference,equality,referenceequals,String,Scala,Reference,Equality,Referenceequals,人们可能会认为,即使字符串是不可变的,Scala中java.lang.String对象的值相等和引用相等也不相同。这意味着,两个包含vals的字符串即使在其字符串相同的情况下也不应是引用相等的。但以下是我在2.9.1.最终回复中得到的信息: scala> val s1 = "a"; val s2 = "a" s1: java.lang.String = a s2: java.lang.String = a scala> s1 eq s2 res0: Boolean = true
val
s的字符串即使在其字符串相同的情况下也不应是引用相等的。但以下是我在2.9.1.最终回复中得到的信息:
scala> val s1 = "a"; val s2 = "a"
s1: java.lang.String = a
s2: java.lang.String = a
scala> s1 eq s2
res0: Boolean = true
你知道为什么结果不是假的吗?用
List(“a”)
代替“a”
进行相同的实验,效果与预期相同。eq
方法在中标记为final。是否有专门针对String
或java.lang.String
的编译器魔法?是的,这是编译器魔法。具体来说,这叫做实习。Java也做得很好,只是出于效率的考虑,比如内存使用和允许在不比较每个字符的情况下进行比较。这是一个例子。您还可以使用intern()
方法手动插入字符串。来自:
字符串文字是对类string
(§4.3.1,§4.3.3)实例的引用
此外,字符串文本总是引用类string
的同一实例。这是因为使用方法string.intern
,字符串文字(或者更一般地说,是常量表达式(§15.28)的值的字符串)被“插入”以共享唯一实例
谢谢有趣的是,当我将示例更改为以
val s1=“aa”开头时;val s2=“a”+“a”
,结果仍然相同,即使“a”+“a”
不是常量表达式(是吗?)。因此,Scala的功能似乎比Java规范所说的要多一些。“a”+“a”
是一个常量表达式,请参见Java规范中的常量表达式似乎与Scala不完全相同。例如,使用常量表达式页面上给出的一个示例,“整数”+java.lang.Long.MAX_VALUE+“非常大。”
不受scalac限制。