Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中java.lang.String的引用相等_String_Scala_Reference_Equality_Referenceequals - Fatal编程技术网

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

人们可能会认为,即使字符串是不可变的,Scala中java.lang.String对象的值相等和引用相等也不相同。这意味着,两个包含
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限制。