kotlin中数据类的等价方法

我有以下的数据类

data class PuzzleBoard(val board: IntArray) { val dimension by lazy { Math.sqrt(board.size.toDouble()).toInt() } } 

我读了Kotlin中的数据类,可以免费获得equals()/ hashcode()方法。

我实例化了两个对象。

 val board1 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0)) val board2 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0)) 

但是下面的语句仍然返回false。

 board1 == board2 board1.equals(board2) 

在Kotlin data类相等性检查中,数组与其他类一样,使用equals(...)进行比较,它比较数组引用而不是内容。 这个行为在这里描述:

所以,只要你说

  • arr1 == arr2

  • DataClass(arr1) == DataClass(arr2)

你得到的数组通过equals() ,即引用。

鉴于,

 val arr1 = intArrayOf(1, 2, 3) val arr2 = intArrayOf(1, 2, 3) println(arr1 == arr2) // false is expected here println(PuzzleBoard(arr1) == PuzzleBoard(arr2)) // false too 

要覆盖这个,并让数组在结构上进行比较,可以使用Arrays.equals(...)Arrays.hashCode(...)在您的数据类中实现equals(...) + hashCode() Arrays.hashCode(...)

 override fun equals(other: Any?): Boolean{ if (this === other) return true if (other?.javaClass != javaClass) return false other as PuzzleBoard if (!Arrays.equals(board, other.board)) return false return true } override fun hashCode(): Int{ return Arrays.hashCode(board) } 

这个代码是IntelliJ IDEA可以为非数据类自动生成的。

另一个解决方案是使用List<Int>而不是IntArray 。 列表在结构上进行比较,以便您不需要重写任何内容。

对于Kotlin中的Data类 ,如果两个对象的参数值相同,则hashcode()方法将生成并返回相同的整数。

 val user = User("Alex", 1) val secondUser = User("Alex", 1) val thirdUser = User("Max", 2) println(user.hashCode().equals(secondUser.hashCode())) println(user.hashCode().equals(thirdUser.hashCode())) 

运行此代码将返回TrueFalse,因为当我们创建secondUser对象时,我们已经传递了相同的参数作为对象用户 ,所以为它们生成的hashCode()整数将是相同的。

也如果你会检查这个:

 println(user.equals(thirdUser)) 

它将返回false。

根据hashCode()方法docs

 open fun hashCode(): Int (source) 

返回该对象的哈希码值。 hashCode的一般合约是:

只要不止一次在同一个对象上被调用,hashCode方法必须始终返回相同的整数,前提是没有修改对象的等号比较中使用的信息。

如果根据equals()方法两个对象相等,那么对这两个对象的每一个调用hashCode方法必须产生相同的整数结果。

欲了解更多详情,请参阅这里的讨论