我是Scala的新手,但我懂Java。因此,据我所知,不同之处在于Scala中的==
充当Java中的.equals
,这意味着我们正在寻找值;Scala中的eq
在Java中充当==
,这意味着我们正在寻找引用地址而不是值。
但是,运行以下代码后:
val greet_one_v1 = "Hello"
val greet_two_v1 = "Hello"
println(
(greet_one_v1 == greet_two_v1),
(greet_one_v1 eq greet_two_v1)
)
val greet_one_v2 = new String("Hello")
val greet_two_v2 = new String("Hello")
println(
(greet_one_v2 == greet_two_v2),
(greet_one_v2 eq greet_two_v2)
)
我得到以下输出:
(true,true)
(true,false)
我的理论是,这些字符串的初始化是不同的。因此,val greet_one_v1 = "Hello"
与val greet_one_v2 = new String("Hello")
有何不同?或者,如果我的理论不正确,为什么我会有不同的输出?
正如Luis Miguel Mejía Suárez正确回答的那样,答案在于字符串互联,这是JVM(Java虚拟机(自动执行的一部分。要启动一个新的String,它需要像上面的例子一样显式启动;否则,出于优化原因,Java将为相同的值分配相同的内存。