2013-12-17 194 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)