2017-03-17 48 views
-3

我正在學習scala並翻閱基礎知識。這是什麼意思?「在Scala ==和!=方法檢查值相等,而不是檢查引用相等的Java」

我無法理解「在Scala ==和!=方法中檢查值是否相等,而不是檢查引用相等的Java」。

有人可以舉一些例子,並嘗試用簡單的英文解釋嗎?

+3

你想谷歌這些條款;這是全面解釋的基本內容。 – GhostCat

+0

考慮,例如,[在Java中==和equals()之間的區別是什麼](/ questions/7520432/java中的什麼是-vs-equals-in-difference) –

回答

2

案例1 - value classesAnyVal)和case classes

隨着價值類在Scala中,==!=做價值進行檢查。

值類是實例未由底層主機系統表示爲 對象的類。所有的值類都繼承自 類AnyVal。

scala中的所有圖元Int,Float等都是值類。

scala> val quantity1 = 100 
quantity1: Int = 100 

scala> val quantity2 = 100 
quantity2: Int = 100 

scala> quantity1 == quantity2 
res9: Boolean = true 

而且,與case classes==工作implicitily,

案例類是應該 完全依賴他們的構造函數的參數平原和不可改變的數據保持對象

scala> case class Item(name: String, quantity: Int) 
defined class Item 

現在,比較兩個項目只需==將檢查項目中的所有值是平等的。

scala> Item("Jacket", 100) == Item("Pants", 10) 
res0: Boolean = false 

scala> Item("Jacket", 100) == Item("Jacket", 100) 
res1: Boolean = true 

案例2 - 斯卡拉參考類(AnyRef)和Java類(java.lang.Object

但隨着Ref班Scala和所有的Java類,如果你這樣做==,它會檢查實例的引用,而不是直到你寫下你自己的equals method

的Java實施例,

static class Item { 
     String name; 
     int quantity; 

     Item(String name, int quantity){ 
      this.name = name; 
      this.quantity = quantity; 
     } 
    } 
    public static void main(String[] args) { 
     Item item1 = new Item("Jacket", 100); 
     Item item2 = new Item("Pants", 10); 
     Item item3 = new Item("Jacket", 100); 

     System.out.println(item1 +"==" + item2 + " " + (item1 == item2)); //false 
     System.out.println(item1 +"==" + item3 + " " + (item1 == item3)); //false 
    } 

==比較結果將是

[email protected][email protected] false 
[email protected][email protected] false 

哪裏1b28cdfaitem1實例REF。您看到item1item3具有相同的數據,但==給出了錯誤,因爲它們是涉及兩個不同地址的兩個不同實例。

要模仿斯卡拉在值類==上所做的工作,請執行如下的equals方法並執行手動相等性檢查。

static class Item { 
    String name; 
    int quantity; 

    Item(String name, int quantity){ 
     this.name = name; 
     this.quantity = quantity; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     Item i = (Item) obj; 
     return this.name.equals(((Item) obj).name) && this.quantity == ((Item) obj).quantity; 
    } 
} 

public static void main(String[] args) { 
    Item item1 = new Item("Jacket", 100); 
    Item item2 = new Item("Pants", 10); 
    Item item3 = new Item("Jacket", 100); 

    System.out.println(item1 +".equals(" + item3 + ") " + (item1.equals(item3))); //true 
} 

同樣使用Scala參考類,即``==如果equals方法未實現

scala> class Store(name: String){} //equivalent to Store extends `AnyRef` 
defined class Store 

scala> val store1 = new Store("a") 
store1: Store = [email protected] 

scala> val store2 = new Store("a") 
store2: Store = [email protected] 

scala> store1 == store2 
res7: Boolean = false 

但是,如果有自己的equals方法斯卡拉參考類則==指基準進行比較你的.equals方法。

例,

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class Store(val name: String){ 
    override def equals(that: Any) : Boolean = { 
     val thatStore = that.asInstanceOf[Store] 
     name == thatStore.name 
    } 
} 

scala> new Store("JWN") == new Store("JWN") // calls s1.equals(s2) 
res1: Boolean = true 
+0

感謝您的詳細解釋 – jason

+0

「在scala中,==和!=執行值檢查」和「但是在Java中,如果您執行==,它將檢查實例引用而不是值,直到您編寫自己的equals方法」錯誤(首先有時,第二總是)。 –

+0

@AlexeyRomanov多數民衆贊成是正確的,它取決於我創建的對象是價值類或ref類在斯卡拉。 – prayagupd