集合(Scala 2.8 - 2.12)

相等性

语言

集合库对相等性和哈希处理具有统一的方法。首先,其思想是将集合划分为集合、映射和序列。不同类别中的集合始终不相等。例如,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 的位置不同的位置。

此页面的贡献者