【问题标题】:kotlin - how to override hashcodekotlin - 如何覆盖哈希码
【发布时间】:2019-03-21 16:42:21
【问题描述】:

我已经覆盖了 java 对象的 equals 方法。 (实际上是 kotlin 中的对象,但它很容易理解,我只是重写了 equals 方法)。但现在为了维护 equals 合同,我还应该重写 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 覆盖中,我只是想检查 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)。

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

更新:这就足够了:

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

【问题讨论】:

标签: kotlin equals


【解决方案1】:

由于您的#equals() 仅依赖于id_address,因此它应该用于哈希码计算。我更喜欢:

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

【讨论】:

  • Objects.hash 对我不可用,因为我支持旧设备。你能告诉我如何用旧的方式来做吗?我可以覆盖 fun hashCode() = id_address.hashCode() 然后我还必须知道如果 id_address 为空该怎么办
  • 覆盖 fun hashCode() = id_address ,我是这样做的。我将 id_address 默认设置为零。感谢您的帮助。
  • 您还可以使用 elvis 运算符来支持哈希码中的空值: override fun hashCode() = id_address ?: -12345 // 或任何其他任意值,最好不要为零,因为这会产生哈希冲突如果 id_address 通常为零。
  • 请注意,在最新版本的 Kotlin(我认为是 1.3 或更高版本)中,甚至可以在 null 对象上调用 hashCode。有关详细信息,请参阅here。所以在这种情况下,就不需要猫王操作员了。
  • 不错的@SomeGuy
【解决方案2】:

示例 POJO 类 (dataVO) 覆盖哈希码和等于, @数据:Lombok

有用的链接:

https://www.geeksforgeeks.org/override-equalsobject-hashcode-method/

Why do I need to override the equals and hashCode methods in Java?

https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/

 @Data

    public class dataVO implements Serializable {

    private static final long serialVersionUID = 1L;
    private int id;
    private String name;

   public String toString(){ 
          return "name:"+name;  
    }  
  @Override
    public boolean equals(Object obj) {
       if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
     if (your logic) {
        return true; 
     }
     else {
       return false;
     }
   }

    @Override
    public int hashCode() {
        return id;
    }
}

【讨论】:

猜你喜欢
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多