我应该覆盖集合的hashCode()吗?

phi*_*294 6 java collections hashcode

鉴于我有一些课程,其中包含各种领域:

class MyClass {
    private String s;
    private MySecondClass c;
    private Collection<someInterface> coll;
    // ...

    @Override public int hashCode() {
        // ????
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,我确实有各种各样的物品,我想存放在一个HashMap.对于这一点,我需要的hashCode()MyClass.

  1. 我得去到各个领域和各个父类递归,以确保它们都实现hashCode()正常,否则hashCode()MyClass可能没有考虑到一些值.这是正确的吗?

  2. 我该怎么办Collection?我可以一直依赖它的hashCode()方法吗?它是否会考虑我的someInterface对象中可能存在的所有子值?


我在这里打开了关于唯一ID对象的实际问题的第二个问题:如何为对象生成(几乎)唯一的哈希ID?


澄清:

你班上有什么或多或少的不合理吗?字符串s?然后只将其用作哈希码.

如果coll更改其中一个对象中的任何值,则两个对象的MyClass hashCode()肯定会有所不同.如果两个对象的所有字段都存储相同的值,HashCode应该只返回相同的值.基本上,在MyClass对象上进行一些耗时的计算.如果计算已经使用完全相同的值在前一段时间完成,我想多余时间.为此,如果结果已经可用,我想查看HashMap.

你会在HashMap中使用MyClass作为键还是值?如果是键,则必须覆盖equals()和hashCode()

因此,我使用hashCode OF MyClass作为HashMap中的.值(计算结果)将是不同的,如整数(简化).

您认为平等对多个馆藏意味着什么?它应该依赖于元素排序吗?它应该只取决于存在的绝对元素吗?

这不会取决于存储的Collection类型coll吗?虽然我觉得订购并不重要,不

你从这个网站得到的回应是华丽的.谢谢你们

@AlexWien取决于该集合的项是否是该类的等价定义的一部分.

是的,是的,他们是.

Joh*_*ica 7

  1. 我得去到各个领域和各个父类递归,以确保它们都实现hashCode()正常,否则hashCode()MyClass可能没有考虑到一些值.这是正确的吗?

那是对的.它并不像听起来那么繁重,因为经验法则是你只需覆盖hashCode()就可以覆盖equals().您不必担心使用默认值的类equals(); 默认hashCode()就足够了.

此外,对于您的类,您只需要在equals()方法中对比较的字段进行哈希处理.例如,如果其中一个字段是唯一标识符,则只需检查该字段equals()并对其进行哈希处理即可hashCode().

所有这一切都取决于你是否也要压倒一切equals().如果你还没有覆盖它,也不要打扰它们hashCode().

  1. 我该怎么办Collection?我可以一直依赖它的hashCode()方法吗?它是否会考虑我的someInterface对象中可能存在的所有子值?

是的,您可以依赖Java标准库中的任何集合类型来hashCode()正确实现.是的,任何ListSet将考虑其内容(它将项目的哈希码混合在一起).

  • 我们不知道该集合的内容是否是该类对等定义的一部分; 这是OP决定的; 但如果是,则应将其包含在哈希码中. (3认同)