Set中的重复项

在Kotlin中,我有一个数据类的MutableSet 。 数据类不会覆盖equals()hashCode() 。 我一直在遇到涉及集合中重复对象的错误,并且我注意到调用foo.containsAll(foo)为该集合返回false

我经历了集合中的每个项目,只有少数返回falsefoo.contains(foo.toList()[i]) 。 对于那些,调用foo.toList()[i] == foo.toList()[i]返回true 。 所以,平等检查工作。

这里发生了什么?

我相信这是可能的唯一方法(缺乏反思等)是如果你的数据类包含可变的东西和一个实例改变后,添加到集等状态,例如

 data class Foo(var int: Int = 0) data class Bar(val string: String, val foo: Foo = Foo()) val bars = mutableSetOf() bars += Bar("") bars += Bar("") println(bars.containsAll(bars)) // true bars.first().foo.int = 12 println(bars.containsAll(bars)) // false 

这是因为hashCode()的结果被用在集合中来标识它,但是如果状态在你的数据类的一个实例中改变,那么它可能会有不同的散列值,导致这样的问题。

一般来说,地图中的元素和键都是不可变的,以避免这个问题。