java – 我应该覆盖集合的hashCode()吗?
鉴于我有一些课程,其中包含各种领域:
class MyClass { private String s; private MySecondClass c; private Collection<someInterface> coll; // ... @Override public int hashCode() { // ???? } } 而且,我确实有各种各样的对象,我想将它们存储在HashMap中.为此,我需要拥有MyClass的hashCode(). >我将必须递归进入所有字段和相应的父类,以确保它们都正确实现hashCode(),因为否则MyClass的hashCode()可能不会考虑某些值.这是正确的吗? 我在这里打开了关于唯一ID对象的实际问题的第二个问题:How do I generate an (almost) unique hash ID for objects? 澄清:
如果其中一个对象的coll中的任何值发生更改,则两个对象的MyClass hashCode()肯定会有所不同.如果两个对象的所有字段都存储相同的值,HashCode应该只返回相同的值.基本上,在MyClass对象上进行一些耗时的计算.如果计算已经使用完全相同的值在前一段时间完成,我想多余时间.为此,如果结果已经可用,我想查看HashMap.
因此,我使用hashCode OF MyClass作为HashMap中的键.值(计算结果)将是不同的,如整数(简化).
这不会取决于存储在coll中的Collection类型吗?虽然我觉得订购并不重要,不 你从这个网站得到的回应是华丽的.谢谢你们
是的,是的,他们是. 解决方法
那是对的.它并不像它听起来那么繁重,因为经验法则是你只需覆盖hashCode()如果你重写equals().您不必担心使用默认equals()的类;默认的hashCode()就足够了. 此外,对于您的类,您只需要在equals()方法中散列您比较的字段.例如,如果其中一个字段是唯一标识符,则只需在equals()中检查该字段并在hashCode()中对其进行散列即可. 所有这一切都取决于你是否也覆盖了equals().如果你没有覆盖它,也不要打扰hashCode().
是的,您可以依赖Java标准库中的任何集合类型来正确实现hashCode().是的,任何List或Set都会考虑其内容(它会将项目的哈希码混合在一起). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |