繁体   English   中英

我们可以像Java中的ArrayList一样覆盖非哈希集合中的hashCode和equals方法吗?

[英]Can we override hashCode and equals method in Non hash Collection like ArrayList in Java?

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

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

至于这样做的“意义”,那取决于你。

为什么你通常会覆盖它们? 因为您希望两个对象在技术上是两个不同的实例,但在功能上是相同的实例,在哈希实现(例如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() 但是,您可以做的是将该列表包装在您的类中,然后根据需要实现这些方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM