【发布时间】:2018-07-04 14:41:21
【问题描述】:
我使用的是 Scala 2.11。
我有一个案例类 Dimension,我创建了它的 3 个实例。当我将它们放入 HashSet 时,我惊讶地发现只有 1 被正确添加。然后我尝试调试并发现它们具有相同的hashCode。
我是 Scala 新手,但在 Java 方面有很多经验。我想知道为什么即使它们具有不同的字段,它们也都具有相同的 hashCode 以及 Scala 案例类中 hashCode 方法的默认实现是什么?以及 HashSet/HashMap 在 Scala 中是如何工作的?
这是我的代码示例。
object Echo {
def main( args:Array[String] ):Unit = {
var d1 = new Dimension
d1.name = "d1"
d1.dimensionId = "1"
println("d1:" + d1.hashCode()) // d1, d2, d3 have the same hashCode
var d2 = new Dimension
d2.name = "d2"
d2.dimensionId = "2"
println("d2:" + d2.hashCode())
var d3 = new Dimension
d3.name = "d3"
d3.dimensionId = "3"
println("d3:" + d3.hashCode())
var l = List(d1, d2, d3)
val categories = mutable.HashSet.empty[Dimension]
l.foreach(md => {
categories += md
})
println(categories.size) // size is 1
}
}
case class Dimension() {
var dimensionId: String = _
var name: String = _
}
【问题讨论】: