我正在學習scala並翻閱基礎知識。這是什麼意思?「在Scala ==和!=方法檢查值相等,而不是檢查引用相等的Java」
我無法理解「在Scala ==和!=方法中檢查值是否相等,而不是檢查引用相等的Java」。
有人可以舉一些例子,並嘗試用簡單的英文解釋嗎?
我正在學習scala並翻閱基礎知識。這是什麼意思?「在Scala ==和!=方法檢查值相等,而不是檢查引用相等的Java」
我無法理解「在Scala ==和!=方法中檢查值是否相等,而不是檢查引用相等的Java」。
有人可以舉一些例子,並嘗試用簡單的英文解釋嗎?
AnyVal
)和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
AnyRef
)和Java類(java.lang.Object
)但隨着Ref
班Scala和所有的Java類,如果你這樣做==
,它會檢查實例的引用,而不是直到你寫下你自己的equals method。
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
哪裏1b28cdfa
爲item1
實例REF。您看到item1
和item3
具有相同的數據,但==
給出了錯誤,因爲它們是涉及兩個不同地址的兩個不同實例。
要模仿斯卡拉在值類==
上所做的工作,請執行如下的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> 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
你想谷歌這些條款;這是全面解釋的基本內容。 – GhostCat
考慮,例如,[在Java中==和equals()之間的區別是什麼](/ questions/7520432/java中的什麼是-vs-equals-in-difference) –