gpt4 book ai didi

kotlin - 如何覆盖哈希码

转载 作者:行者123 更新时间:2023-12-02 12:36:02 34 4
gpt4 key购买 nike

我重写了 java 对象的 equals 方法。 (实际上是 kotlin 中的对象,但它很容易理解,我只是重写了 equals 方法)。但现在为了维护 equals 契约(Contract),我还应该重写 hashcode 方法。但我不确定如何为适合 equals 方法的哈希码实现。这是我目前所拥有的:

    data class AddressModel(
var id_address: Int = 0,
var id_country: Int = 0,
) {

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is AddressModel)
return false
else {
if (other.id_address == this.id_address)
return true
}
return false
}
}

编译器强烈建议我覆盖 hashCode 方法。但我不明白要实现什么。在 equals override 中,我只是想检查 addressModel 是否与另一个具有相同的 Id,如果有,那么我假设它是相等的。

这是我目前所拥有的:

override fun hashCode(): Int {
return Objects.hash(id_address, id_country);
}

但我认为这样更好:

override fun hashCode(): Int {
return Objects.hash(id_address); //base hash off same as equals the id_address
}

这是我推荐的阅读方式,但它是什么意思?如果我添加了更多的类字段,我是否还需要向 Objects.hash 方法添加更多的字段?我更喜欢旧的 skool 方式来做,因为这个调用需要 android api 19,我支持较低的 (api 16)。

需要明确的是,我知道如果我不重写哈希码和等于,那么每个实例,例如“new AddressModel(707, 867)”,将具有不同的哈希码。然后 HashMap 例如会认为这些对象是不同的并且不等于在计算存储哈希时替换它们。但我只是不知道在 hashCode 实现中放什么。你可以用 kotlin 或 java 告诉我没问题。

更新:这是否足够:

override fun hashCode(): Int { return id_address.hashCode() }

最佳答案

因为您的#equals() 只依赖于id_address,所以它应该用于哈希码计算。我更愿意:

override fun hashCode() = Objects.hash(id_address)

关于kotlin - 如何覆盖哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52847477/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com