Kotlin:即使地图是平等的,地图比较抛出也会失败

我试图比较2个地图,两个填充相同的字符串(仅用于培训)。 当我尝试比较它们时,我通过map.equals(map2)返回false

但是,如果我这样做,并将.toString()添加到comparison它返回truemap.toString().equals(map2.toString())

怎么样? 我究竟做错了什么?

Kluent library及其shouldEqual方法Kluent library发生同样的情况。 我也尝试将该maps values存入arrays并试图比较这些arrays但仍然返回false

此外,当我打印每个地图的所有项目,我看到相同的3个字符串,但比较返回fail

代码如下:

 class MapsTesting { class Items(name1: String, amount1: String, price1: String) { var name: String = name1 var amount: String = amount1 var price: String = price1 override fun toString(): String { return "name:$name,amount:$amount,price:$price \n" } } @Test fun mapTest() { val mapOfItems: MutableMap<String, Items> = mutableMapOf() mapOfItems["Materials"] = Items("STEP 1", "STEP 2", "View All Stones") val mapOfItems2: MutableMap<String, Items> = mutableMapOf() mapOfItems2["Materials"] = Items("STEP 1", "STEP 2", "View All Stones") mapOfItems.forEach { t, u -> println("map key:$t,map value:${u.toString()}") } mapOfItems2.forEach { t, u -> println("map key:$t,map value:${u.toString()}") } val comparison : Boolean = mapOfItems.toString().equals(mapOfItems2.toString()) //this returns true val comparison2 : Boolean = mapOfItems.equals(mapOfItems2) //this returns false println(comparison) println(comparison2) val map1 = mapOfItems.toString() val map2 = mapOfItems2.toString() //this returns true //if I delete toString() it will return false map1 shouldEqual map2 } } 

这是我得到的错误:

 java.lang.AssertionError: expected: java.util.LinkedHashMap<{Materials=name:STEP 1,amount:STEP 2,price:View All Stones }> but was: java.util.LinkedHashMap<{Materials=name:STEP 1,amount:STEP 2,price:View All Stones }> 

当使用equals方法比较两个映射时,标准实现将使用equals方法比较所有的键和值。

Your Items类使用标准的equals实现(当且仅当引用同一个对象时,两个引用值相等)。 但是,在不同的地图中显然有两个不同的实例。

您必须重写Items#equals方法或将Items类标记为data class

 data class Items(var name1: String, var amount1: String, var price1: String) 

Kotlin会生成正确的equalshashCodetoString方法。

在此之后,地图比较将正常工作。