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

为什么hashCode()可以为Java中的不同对象返回相同的值?

乐正宜人
2023-03-14
问题内容

我正在阅读Head First Java的书中的一句话:

关键是哈希码可以相同,而不必保证对象相等,因为该hashCode()方法中使用的“哈希算法” 可能会为多个对象返回相同的值。

为什么该hashCode()方法可能为不同的对象返回相同的值?这不会引起问题吗?


问题答案:

*对对象进行 *散列 意味着“ 找到可以由相同实例一次又一次地再现的良好的描述性值(数字)
”。由于Java的哈希码Object.hashCode()类型为int,因此只能具有2^32不同的值。这就是为什么当两个不同的对象产生相同的hashCode时,将根据哈希算法产生所谓的“冲突”的原因。

通常,这不会产生任何问题,因为hashCode()通常与一起使用equals()。例如,a
HashMap将调用hashCode()其键,以了解键是否可能已包含在HashMap中。如果HashMap找不到哈希码,则很明显该密钥尚未包含在HashMap中。但是,如果这样做,则必须使用仔细检查所有具有相同哈希码的键equals()

A.hashCode() == B.hashCode() // does not necessarily mean
A.equals(B)

A.equals(B) // means
A.hashCode() == B.hashCode()

如果equals()hashCode()正确实施。

有关常规hashCode合同的更精确描述,请参见Javadoc。



 类似资料:
  • 问题内容: 我正在尝试一些有关Java中对象相等的代码。正如我在某处阅读 是通过应用哈希函数生成的数字。每个对象的哈希函数可以不同,但​​也可以相同。在对象级别,它返回对象的内存地址。 现在,我有示例程序,该程序连续运行10次。每次我运行程序时,我都会得到与哈希码相同的值。 如果函数返回对象的内存位置,那么java(JVM)如何在连续运行中将对象存储在相同的内存地址? 您能给我一些见解和您对这个问

  • 问题内容: 使用Java的hashcode函数是否可能对不同的字符串使用相同的hashcode?或者如果可能的话,其可能性的百分比是多少? 问题答案: Java哈希码是32位。它散列的可能字符串的数量是无限的。 所以是的,会有碰撞。百分比是没有意义的-存在无限数量的项目(字符串)和有限数量的可能的哈希。

  • } 我得到了下面的结果。但是在这个结果中,高亮显示的行具有相同的列名,但是别名不同。为什么hibernate会得到相同的Cloumn? 冬眠:删除表,如果存在hibernate_sequence hibernate:删除表(如果存在)UserDetails Hibernate:如果存在,则删除表车辆Hibernate:创建表hibernate_sequence(next_val bigint)En

  • 问题内容: 在以下代码中,我不明白为什么当它属于两个不同的对象时具有相同的ID? 问题答案: 我认为这是正在发生的事情: 取消引用时,将在内存中创建其副本。该存储位置由以下位置返回 由于没有引用到刚刚创建的方法的副本,因此GC将其回收,并且该内存地址再次可用 取消引用时,将在相同的内存地址(可用)中创建它的副本,您可以再次使用该地址。 第二个副本是GCd 如果您要运行一堆其他代码并再次检查实例方法

  • 问题内容: 我运行了跟随脚本(java),它给了我奇怪的结果。有人可以帮忙解释吗? 记录结果(彼此不同): - - 背景 - - 我想将自己的keyGenrator用于@Cacheable批注(Spring和ehCache)。 在这种情况下,我发现缓存总是丢失的。 然后,我必须更改为: 谢谢 问题答案: 这是因为for 不会被覆盖。即使条目相同,也没有理由为什么的两个实例应该具有相同的值。 试试这

  • 问题内容: 我以为运算符检查对象的相等性。但事实并非如此: 问题答案: *Python *将相同的内存 位置用于方法和,这是*两个对象,它们的生命周期不重叠,因此对它们返回相同的标识。请参阅下面的详细说明。 从is运算符的文档中: 运算符是否测试对象标识:并且仅当x和y是同一对象时,x is y才是true。 从ID的文档中 返回对象的“身份”。这是一个整数(或长整数),在此对象的生存期内,此整数