Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我们不';不要使用hashmap或hashset_Java_Equals_Hashcode - Fatal编程技术网

Java 如果我们不';不要使用hashmap或hashset

Java 如果我们不';不要使用hashmap或hashset,java,equals,hashcode,Java,Equals,Hashcode,我的同事正在重写equals()方法。我的回答是,您是否也重写了hashCode()方法?他的回答是因为我们不使用哈希映射或哈希集,如果我们重写hashCode(),这其实并不重要。这是正确的吗?是的,事实上他是正确的-但是,如果有一天你需要将你的对象放在一个基于哈希的集合中,你将不得不到处添加哈希代码,这可能会很烦人+在那一天你可能会错误地实现你的哈希代码(即与equals不一致),因为你错过了equals方法中的一些微妙之处 考虑到大多数IDE都提供了自动生成equals/hashcode的

我的同事正在重写
equals()
方法。我的回答是,您是否也重写了
hashCode()
方法?他的回答是因为我们不使用哈希映射或哈希集,如果我们重写
hashCode()
,这其实并不重要。这是正确的吗?

是的,事实上他是正确的-但是,如果有一天你需要将你的对象放在一个基于哈希的集合中,你将不得不到处添加哈希代码,这可能会很烦人+在那一天你可能会错误地实现你的哈希代码(即与equals不一致),因为你错过了equals方法中的一些微妙之处

考虑到大多数IDE都提供了自动生成equals/hashcode的特性,我认为没有什么理由不同时创建这两个特性

另一种方式是:当您重写父类中的方法时,您应该遵循该父类定义的约定。在对象的情况下,结果非常清楚:

请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码

因此,除非您有真正的设计理由不重写hashcode,否则默认的决定应该是遵循父类约定,并且不重写任何一个或同时重写两个

常规:

仅重写您希望以自己的方式使用的方法,以及受此重写影响的方法

针对您的问题:

从java文档

注意,通常需要重写hashCode方法 无论何时重写equals()方法,以便维护 hashCode方法的契约,它声明必须有相等的对象 具有相等的散列码


这是一种代码气味。例如,如果您重写hashCode或equals而不重写另一个,Findbugs将警告您。您应该重写这两者,以便它们彼此一致(即,a.equals(b)=>a.hashCode()==b.hashCode())


现在稍微努力一下,以后可能会省去很多麻烦。

如果覆盖
equals()
,也要覆盖
hashCode()
。即使您现在不使用
hashCode()
,您或其他人也可能会使用它


有关此主题的更多信息,请查看优秀的

假设您在不重写equals和hashCode方法的情况下创建了两个不同的对象。然后,如果调用equals方法,java隐式调用hashCode方法,然后检查hashcodes的相等性

重写hashCode方法就足以检查两个对象的相等性。它将对未来有用。您可以在集合上使用此类

否则,若您实现justequal方法,它将解决两个对象的justequal,而不是更多

必须在每个重写等于的类中重写哈希代码。否则将导致违反Object.hashCode的一般约定,这将阻止类与所有基于哈希的集合(包括HashMap、HashSet和Hashtable)一起正常工作

有效的Java第9项:重写equals时始终重写hashCode


如果您的类是公共类,那么您无法控制在未来的开发中将如何使用您的类。如果不查看源代码(或通过反射),就无法知道该类是否重写了hasCode方法,如果用户在任何基于散列的集合中使用它,则用户会对结果感到惊讶

这通常是正确的,但equals和hashcode实际上是一致的:重写none或两者都是默认选择,使它们不一致(只重写其中一个)是一个重要的设计决策。我认为现在我在ans中有了一些意义。Java不会隐式调用
hashCode
来默认实现
equals
。它使用
=
验证指向同一引用的两个对象。您可以让
hashCode
在每次调用时返回一个随机值,如果您指向同一个对象,
equals
的默认实现仍然有效。您关于通过hashCode()检查相等性的声明实际上是不正确的。相同的散列码不能保证你的相等。是的,标记你是对的,它检查引用。ATrubka,在我的回答中,我特别指定对象类的默认实现将用于我的示例。我的回答中没有具体说明其他可能性。+1但另一方面,如果代码现在所依赖的是
equals
,那么
hashCode
很有可能落后于对
equals
的更改,再次与之不一致。在我看来,最好的折衷办法是一个简单的
return1---至少在技术上是正确的。我的
问题返回1是指,如果以后使用
HashSet
,可能会导致无提示、难以调试的性能问题。相反,我会将
hashCode()
实现为
抛出新的UnsupportedOperationException()
,这需要最少的努力,但当您稍后返回并使用
HashSet
时,您显然不需要费心实现
hashCode()
第一次。@LouisWasserman如果您真的不想实现hashcode,那么抛出一个异常确实是一个非常好的主意。非常感谢大家!assylias-你在第一段中所说的“你必须在任何地方添加哈希代码”是什么意思?我的同事不是只需要将
hashCode()
方法添加回他重写的一个类
equals()
?如果只涉及一个类,那么是的,您只需要添加一个方法-我以为他想将其应用于许多类。这是真的!我想我的同事可能没有考虑过为其他人发布他的代码