过时通知
集合库对相等性和哈希处理具有统一的方法。首先,其思想是将集合划分为集合、映射和序列。不同类别中的集合始终不相等。例如,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)
buf: scala.collection.mutable.ArrayBuffer[Int] =
ArrayBuffer(1, 2, 3)
scala> val map = HashMap(buf -> 3)
map: scala.collection.mutable.HashMap[scala.collection.
mutable.ArrayBuffer[Int],Int] = Map((ArrayBuffer(1, 2, 3),3))
scala> map(buf)
res13: Int = 3
scala> buf(0) += 1
scala> map(buf)
java.util.NoSuchElementException: key not found:
ArrayBuffer(2, 2, 3)
在此示例中,最后一行中的选择很可能失败,因为数组 xs
的哈希代码已在倒数第二行中更改。因此,基于哈希代码的查找将查看与存储 xs
的位置不同的位置。