Scala 地图中 .contains() 和 .keySet.exists() 的区别

difference between .contains() and .keySet.exists() in Scala Maps

我在 Scala 中有一张地图 var surfaceMap = Map[Surface, Array[Event]](),其中 Surface class 表示由平面组成的几何表面。在 Surface class 中,我定义 equals 方法如下:

final override def equals(other: Any): Boolean = other match {
    case that: Surface => (planes.deep == that.planes.deep) 
    case _ => false
}
final override def hashCode: Int = planes.##

等式检查构成曲面的所有平面是否具有相同的坐标。我有一个包含 8 个元素的 surfaceMap,当我想将 Event 添加到地图中已有的表面时,当我使用 surfaceMap.contains(newSurface) 检查密钥是否存在时,它 returns false但是当我使用 surfaceMap.exists(_._1 == newSurface)surfaceMap.keySet.exists(_ == newSurface) 时,它需要更长的时间并且 returns 是正确的。我以为 .contains().keySet.exists() 做同样的工作,但看起来它们是不同的,但我不明白其中的区别。任何帮助表示赞赏。

Map.keySet.existsMap.containsMap.keySet.contains 做的事情不同。

区别在于.contains使用对象的哈希码(前提是,我们使用的是默认的HashMap实现)来快速导航到您要查找的键。这是一个恒定时间 (O(1)) 的操作。

.exists 不能那样做,因为它正在寻找一个任意条件,而不是一个确切的对象。因此,它必须扫描整个集合并评估每个元素的条件,直到找到匹配的元素。这是一个线性时间(O(N))操作。

至于为什么 Map.contains returns 在您的情况下为 false,那一定是因为您的 hashCode 实现不正确:您使用的是默认值 .##,它不同的实例会有所不同,即使它们包含相同的值(除非是 class)。