当前位置: 首页 > 面试题库 >

没有hashCode()的equals()

孟福
2023-03-14
问题内容

如果我只需要比较对象并且还不打算将对象放入任何基于哈希的容器中,我是否只能实现equals()而不是hashCode()?

似乎所有Java圣经都说这两个必须一起实现。:(

我的担心:-如果我始终将hashCode()与equals()一起实现,将有很多未真正使用的代码,并且没有单元测试的内容。(如果不使用,我不会进行单元测试hashCode())-直到将对象放入基于哈希的容器中时,我才知道如何查找对象。只有到那时,我才能确定要使用哪种哈希策略。


问题答案:

您可以,但是您将打破的常规合约equals,这将导致奇怪的错误。即使您不认为使用哈希码,传递对象的任何外部代码也可能依赖它们,即使它似乎不是基于哈希的。如果您不打算给对象一个像样的哈希方法,至少要使其抛出运行时异常。不过,为您的对象提供像样的hashCode几乎总是更好。



 类似资料:
  • 问题内容: 输出为: 这种“获取”方法的行为如何?由于m1和M2都具有相同的值,并且我没有重写hashcode(),因此将调用对象类的equals()方法吗? 这样对吗 ? 没有哈希码方法,因此JVM无法查看对象m1和m2是否包含不同的值 没有覆盖equals的方法,因此调用了Object类的equals(),并且由于两个对象都不相同,因此上面的代码可以很好地工作,而无需m2替换m1的值。 问题答

  • 该属性返回一个整数,表示数值的哈希码。 语法 (Syntax) num.hashcode 例子 (Example) void main() { int n = 5000; print(n.hashCode); } 它将产生以下output - 成功执行代码后会显示以下输出。 5000

  • 我遇到了一些哈希代码函数,它具有以下功能: 我不完全相信用于计算hashCode的方法,我知道使用质数通常会产生更好的分布。但在这个实现中,我并不真的相信是这样的。 例如,假设一个标准的哈希实现,我会错过0到17*31之间的所有桶。 是不是有些微妙的地方我没看出来?

  • 根据我所读到的, 要使用对象作为hashMap的键,它必须提供正确的重写和equals和hashCode方法的实现。HashMap get(Key k)方法调用Key对象上的hashCode方法,并将返回的hashValue应用到它自己的静态哈希函数中,以找到一个桶位置(备份数组),键和值以名为Entry(Map.Entry)的嵌套类的形式存储在这里。HashMap的内部哈希方法防御质量差的哈希函

  • 问题内容: 我想知道是否有人可以详细解释 在以下哈希码实现中执行(由eclipse生成,但与有效Java相同): 谢谢! 问题答案: 基本上,它对long的高32位与低32位进行异或。这是分解版本: 回答您的评论:您有一个long值,必须将其转换为int才能作为哈希的一部分(结果必须仅为32位)。你打算怎么做?您 可以 只使用低32位-但这意味着 仅 高32位的更改将被忽略,这不会使其成为一个很好

  • 问题内容: and方法必须一致,这意味着当两个对象根据方法相等时,它们的方法应返回相同的哈希值。 如果我们不重写hashCode()方法,则Java将返回唯一的哈希码。 为什么取消注释该行会导致编译错误? 如果对象的哈希码不相等,即使默认哈希码有所不同,为什么它们显示为相等? 问题答案: 平等仅由方法equals()确定。并且hashCode()方法可用于其他情况,例如Map或Set。实际调用eq