集合

相等性

語言

集合程式庫對相等性和雜湊採取統一的方法。首先,將集合分為集合、對應和序列。不同類別的集合永遠不相等。例如,Set(1, 2, 3) 不等於 List(1, 2, 3),即使它們包含相同的元素。另一方面,在同一個類別中,集合只有在它們具有相同的元素(對於序列:相同的元素以相同的順序)時才相等。例如,List(1, 2, 3) == Vector(1, 2, 3),以及 HashSet(1, 2) == TreeSet(2, 1)

對於相等性檢查來說,集合是可變的還是不可變的並不重要。對於可變集合,只需在執行相等性測試時考慮其當前元素即可。這表示可變集合在不同時間可能等於不同的集合,具體取決於添加或移除哪些元素。當將可變集合用作哈希映射中的鍵時,這是一個潛在的陷阱。範例

scala> import collection.mutable.{HashMap, ArrayBuffer}
import collection.mutable.{HashMap, ArrayBuffer}

scala> val buf = ArrayBuffer(1, 2, 3)
val buf: scala.collection.mutable.ArrayBuffer[Int] =
  ArrayBuffer(1, 2, 3)

scala> val map = HashMap(buf -> 3)
val map: scala.collection.mutable.HashMap[scala.collection.
  mutable.ArrayBuffer[Int],Int] = Map((ArrayBuffer(1, 2, 3),3))

scala> map(buf)
val res13: Int = 3

scala> buf(0) += 1

scala> map(buf)
  java.util.NoSuchElementException: key not found:
    ArrayBuffer(2, 2, 3)

在此範例中,最後一行的選取很可能會失敗,因為陣列 buf 的雜湊碼已在倒數第二行中變更。因此,基於雜湊碼的查詢會查看與 buf 儲存位置不同的位置。

此頁面的貢獻者