2013-12-17 188 views
1
scala> val x = "a" 
x: String = a 

scala> val y = "a" 
y: String = a 

据我所知,==将调用equals(值相等)。==和eq运营商

scala> x == y 
res18: Boolean = true 

但是,对我来说意想不到的是x eq y显示正确。据我所知,eq检查object identity

scala> x eq y 
res19: Boolean = true 

是在Scala编译器足够聪明,返回相同的(身份)String对象?我相信这个术语是interning

或者,是eq实际上执行值相等吗?

+1

作为其他答案的对应,尝试'new String(“a”)eq new String(“a”)''。你会得到'false',因为每个定义的构造函数调用都会创建一个不同的实例。 –

+0

@RandallSchulz - 当我在REPL中运行你的例子时,下面的警告在** false **的输出之前:':9:警告:使用'eq'比较一个新对象总会产生错误 new String(“a “)eq new String(”a“) ^' –

回答

7

Scala的字符串实际上是Java.Lang.String,这实际上采用实习 - 斯卡拉看到Reference -

type String  = java.lang.String 
-7

我是一个非常新的程序员。希望我能用我的小知识帮助你。 通常=“相等”符号为变量赋值。但==“double equal”测试该变量的值。

例如:

X = 5

该装置,用于变量x分配5。 OR X的值更改为5

但X == 5是测试x的值,如果它等于5

因此应用程序将是类似的(在C)

if (x == 5) 
{ 
printf("The value of x is 5"); 
} 

所以这里的程序正在测试如果X的值等于5则打印下面的语句。

+6

欢迎来到Stackoverflow!你的回答没有回答这个问题。此外它被标记为Scala而不是C,所以如果你对C更感兴趣,那么[请查看c问题](http://stackoverflow.com/questions/tagged/c)。 –

2

Otávio是正确的,它应该是相同的Java。

要扩展:在documentation of eq有什么样的预期平等方法相当一个很好的解释:

当重写equalshashCode方法,必须确保他们的行为是参照平等一致是很重要的。因此,如果两个对象是彼此的引用(o1 eq o2),它们应该彼此相等(o1 == o2)并且它们应该散列为相同的值(o1.hashCode == o2.hashCode)