我是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 MiguelMejíaSuárez正确回答,答案在于String Interning,这是JVM(Java虚拟机)自动执行的操作的一部分。要启动一个新的String,需要像上面我的示例一样显式启动它。否则,出于优化原因,Java将为相同的值分配相同的内存。