【问题标题】:Can we override hashCode and equals method in Non hash Collection like ArrayList in Java?我们可以像 Java 中的 ArrayList 那样覆盖非哈希集合中的 hashCode 和 equals 方法吗?
【发布时间】:2021-07-06 17:37:13
【问题描述】:

我理解重写 equals() 方法和 hashCode() 方法的目的。但是我的问题是我们可以在像 ArrayList 这样的非哈希集合中覆盖哈希码和等于吗?

【问题讨论】:

  • 我认为你可以,但这样做没有意义
  • 你能举一个更具体的例子来说明你正在尝试做什么吗?您不能覆盖已经存在的类中的方法......但是如果需要,您可以创建自己的集合类并覆盖 hashCode 和 equals。通常集合类对它们的 elements 如何覆盖 hashCode 和 equals 更感兴趣。请澄清问题。
  • 您可以为您创建的任何类覆盖 equals()getHashCode()。当您覆盖它们时,它们可以安全地用作哈希映射中的键。重写这些方法只是提供一种方法来区分该类型的两个对象。
  • @LeiYang:这样做绝对是有意义的——例如,知道一组是否等价于另一组是非常有用的。但目前尚不清楚 OP 到底在问什么……至少对我来说不是。
  • @LeiYang:没有什么可以说必须使用哈希码来实现集合。这样做很常见,但不是基本要求。

标签: java


【解决方案1】:

equals()hashCode() 方法在 Object(Java 中所有内容的父级)中声明,所以从技术上讲是的,您可以从任何类中覆盖它们。

至于做这件事的“意义”,就看你自己了。

为什么你通常会覆盖它们?因为您希望两个对象在技术上是两个不同的实例,但在功能上是相同的实例,在散列实现中以相同的方式进行散列(例如HashMap)。

以此为例:

public class Id {
    private final String id;
    public Id(String id) {
        this.id = id;
    }
}

如果您执行以下操作:

Id id1 = new Id("1");
Id id2 = new Id("1");
id1.equals(id2); //<-- false

...您通过比较它们得到false,因为它们不是同一个实例。 因此,如果您将它们用作哈希映射的键,那么这两个对象将生成两个不同的哈希,因此,将被视为两个单独的键。

但是,对于您而言,字符串 1 在两者中相同的事实可能意味着它们是相同的,应该被视为相同的键。

所以你相应地覆盖equals()hashCode()

如果您需要对任何类型的对象(包括ArrayList)执行相同操作,那么是的,这是有道理的 (注意:当您需要将这些对象用作散列的键时,通常需要这个 - 例如HashMap)。

如果你不这样做,那么不,它不是必需的。

附带说明,ArrayList 不是可修改的类,因此即使您愿意,也无法更改 equals()hashCode() 的实现。 不过,您可以做的是将该列表包装在您的类中,然后根据需要实现方法。

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2018-02-05
    • 2019-01-22
    相关资源
    最近更新 更多