我有以下数据类
data class PuzzleBoard(val board: IntArray) {
val dimension by lazy { Math.sqrt(board.size.toDouble()).toInt() }
}
我读过Kotlin中的数据类get equals()
/ hashcode()
method是免费的。
我实例化了两个对象。
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)
在Kotlindata
类的相等性检查中,与其他类一样,使用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
equals(...)
+ : hashCode()
Arrays.equals(...)
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
。列表在结构上进行了比较,因此您无需覆盖任何内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句