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()))
运行此代码将返回True和False,因为当我们创建secondUser对象时,我们已经传递了相同的参数作为对象用户 ,所以为它们生成的hashCode()整数将是相同的。
也如果你会检查这个:
println(user.equals(thirdUser))
它将返回false。
根据hashCode()方法docs
open fun hashCode(): Int (source)
返回该对象的哈希码值。 hashCode的一般合约是:
只要不止一次在同一个对象上被调用,hashCode方法必须始终返回相同的整数,前提是没有修改对象的等号比较中使用的信息。
如果根据equals()方法两个对象相等,那么对这两个对象的每一个调用hashCode方法必须产生相同的整数结果。
欲了解更多详情,请参阅这里的讨论