class MyClass { private String s; private MySecondClass c; private Collection<someInterface> coll; // ... @Override public int hashCode() { // ???? } }
而且,我确实有各种各样的对象,我想将它们存储在HashMap中.为此,我需要拥有MyClass的hashCode().
>我将必须递归进入所有字段和相应的父类,以确保它们都正确实现hashCode(),因为否则MyClass的hashCode()可能不会考虑某些值.这是正确的吗?
>我该如何处理该系列?我可以一直依赖hashCode()方法吗?它会考虑我的someInterface对象中可能存在的所有子值吗?
我在这里打开了关于唯一ID对象的实际问题的第二个问题:How do I generate an (almost) unique hash ID for objects?
澄清:
is there anything more or less unqiue in your class? The String s? Then only use that as hashcode.
如果其中一个对象的coll中的任何值发生更改,则两个对象的MyClass hashCode()肯定会有所不同.如果两个对象的所有字段都存储相同的值,HashCode应该只返回相同的值.基本上,在MyClass对象上进行一些耗时的计算.如果计算已经使用完全相同的值在前一段时间完成,我想多余时间.为此,如果结果已经可用,我想查看HashMap.
Would you be using MyClass in a HashMap as the key or as the value? If the key,you have to override both equals() and hashCode()
因此,我使用hashCode OF MyClass作为HashMap中的键.值(计算结果)将是不同的,如整数(简化).
What do you think equality should mean for multiple collections? Should it depend on element ordering? Should it only depend on the absolute elements that are present?
这不会取决于存储在coll中的Collection类型吗?虽然我觉得订购并不重要,不
你从这个网站得到的回应是华丽的.谢谢你们
@AlexWien that depends on whether that collection’s items are part of the class’s definition of equivalence or not.
是的,是的,他们是.
解决方法
- I’ll have to go into all fields and respective parent classes recursively to make sure they all implement
hashCode()
properly,because otherwisehashCode()
ofMyClass
might not take into consideration some values. Is this right?
那是对的.它并不像它听起来那么繁重,因为经验法则是你只需覆盖hashCode()如果你重写equals().您不必担心使用默认equals()的类;默认的hashCode()就足够了.
此外,对于您的类,您只需要在equals()方法中散列您比较的字段.例如,如果其中一个字段是唯一标识符,则只需在equals()中检查该字段并在hashCode()中对其进行散列即可.
所有这一切都取决于你是否也覆盖了equals().如果你没有覆盖它,也不要打扰hashCode().
- What do I do with that
Collection
? Can I always rely on itshashCode()
method? Will it take into consideration all child values that might exist in mysomeInterface
object?
是的,您可以依赖Java标准库中的任何集合类型来正确实现hashCode().是的,任何List或Set都会考虑其内容(它会将项目的哈希码混合在一起).