Scala Maps 中 .contains() 和 .keySet.exists() 之间的区别

Vah*_*idB 1 scala contains exists hashmap

var surfaceMap = Map[Surface, Array[Event]]()我在 Scala 中有一张地图,其中Surface类表示由平面组成的几何表面。在Surface类中我定义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.##
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*ima 5

Map.keySet.exists不做与Map.contains,相同的事情Map.keySet.contains

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

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

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