`
Xgeeeeek
  • 浏览: 22403 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

【原创】关于“hashCode相同,两对象不一定相等”的理解

    博客分类:
  • java
阅读更多

文章的解释都是在hashCode和equals方法没有被覆盖的情况,因为被覆盖后,谈论一定不一定就没意义了。

 

刚看到“hashCode相同,两对象不一定相等”这句话,有点不理解,hashcode代表的不就是跟对象在堆上的物理地址一样有唯一性么? 既然地址都一样了,对象还能是两个? 后来补习了下hashCode的知识。

hashCode 其实是使用了一种叫“杂凑”算法的方法算出来的一个int值,杂凑算法可以有多种表现形式(当然java使用的杂凑算法是java认为最有效率的杂凑算法),既然是算出来的,那么就是不准确的(接近准确但还是有误差),肯定会有一种情况,在某一时刻,多个对象传回相同的杂凑值,而且越糟糕的杂凑算法这种情况就越容易出现,所以就能够出现“hashCode相同,对象不一定相等”的情况;那么,反过来,“相等的对象,hashCode一定相同么?“,是的,两对象相等,hashCode 一定相同,why? 想想刚才的”杂凑算法“,应为是一种算法,所以,计算的方法肯定是不变的,所以,相等的对象,杂凑计算得出的hashCode一定相同。

 

刚接触hashCode,理解可能有误,望高手指教。眨眼

 

分享到:
评论

相关推荐

    HashCode相同equals不同的2位字符集合算法

    标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个对象可能具有相同的哈希码(hashCode),但并不意味着它们相等(equals返回true)。这个问题在处理自定义类对象时尤为关键,特别...

    Java理论与实践:hashCode()和equals()方法

    本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...

    关于HashCode码的重复问题 两种验证实例

    1,如果两个对象相同,那么它们的hashCode值一定要相同; 2,如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 3,HashCode码不唯一

    java中Hashcode的作用.docx

    在Java中,如果两个对象的equals方法返回true,那么这两个对象的Hashcode一定相同。反之,如果两个对象的Hashcode相同,那么这两个对象不一定是相等的。 Hashcode只是一个必要条件,而不是充分条件。只有当两个对象...

    HashCode的用法详解

    如果我们不定义 equals() 方法,那么同一个类产生的两个内容完全相同的对象都可以存入 Set,这样就使得 HashSet 失去了它的意义。 hashCode() 的重写 为什么需要重写 hashCode()?因为我们需要确保对象的唯一性。...

    关于hashCode()和equals()的本质区别和联系

    如果两个对象是相等的,那么它们必须有相同的哈希码值。 hashCode() 和 equals() 之间的关系 hashCode() 和 equals() 方法之间存在着非常重要的关系。如果两个对象是相等的,那么它们必须有相同的哈希码值。否则,...

    equals与hashCode方法讲解

    equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法的实现是比较两个对象的内存地址是否相等。如果两个对象的内存地址相同,那么它们就是相等的。...

    深入 HashCode 方法~

    - 同等性原则:如果两个对象相等(根据 `equals()` 方法判断),那么它们的 `HashCode` 必须相同。 - 一致性原则:同一个对象在不同时间调用 `hashCode()` 方法应该返回相同的值,除非对象的状态发生改变。 #### ...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...

    Java_重写equals()和hashCode()

    如果两个对象不相等,那么它们的哈希码不一定不同,但不同的对象应尽可能产生不同的哈希码,以提高哈希表的性能。 在重写 `hashCode()` 时,通常会基于 `equals()` 方法中用于比较对象相等性的属性来计算哈希码。...

    深入HashCode

    当两个对象通过`equals()`方法判断相等时,它们的`hashCode()`值也必须相等。反之,如果两个对象的`equals()`方法返回`false`,那么它们的`hashCode()`值也应该不同。这是Java Object类中的约定,也是所有自定义类...

    hashCode的作用

    如果两个对象的`hashCode`相同,则会进一步调用`equals`方法来判断这两个对象是否相等,避免重复插入相同的元素。 #### 4. `hashCode`与`equals`的关系 通常情况下,如果两个对象相等(即`equals`方法返回`true`)...

    java中hashcode()和equals()方法详解

    - 如果两个对象不相等(即`equals()`返回`false`),它们的`hashCode()`值不一定不同,但最好尽量让它们不同,以减少哈希冲突。 #### `equals()`方法 `equals()`方法同样定义于`Object`类中,用于判断两个对象是否...

    详解Java中用于查找对象哈希码值的hashCode()函数

    由于`a`和`b`的`hashCode()`相同,`HashSet`会假设这两个对象相等,但实际上它们不相等(因为没有重写`equals()`)。这导致了`HashSet`中包含两个看似相同的对象,违反了其设计原则,即不允许重复元素。 为了避免...

    复写hashCode()方法,和equasl()方法

    对于集合类如`HashSet`来说,如果两个对象的`hashCode()`值不同,则可以认为这两个对象不相等;反之,如果两个对象的`hashCode()`值相同,则还需要进一步通过`equals()`方法来确定这两个对象是否真正相等。 #### ...

    hashcode与eqault比较

    2. **非一致性**:如果两个对象的`hashCode`值不同,这并不意味着它们一定不相等。即`hashCode`值相同或不同不能作为判断两个对象是否相等的唯一依据。 3. **效率问题**:在实现`equals`和`hashCode`方法时,应当...

    解析Java对象的equals()和hashCode()的使用

    * 如果你设计的对象类型并不使用于收集性对象,那么没有必要自己再设计这两个函数的处理方式。这是正确的面向对象设计方法,任何用户一时用不到的功能,就先不要设计,以免给日后功能扩展带来麻烦。 * 在设计时,...

    java中hashcode()和equals()的详解

    但是,两个不相等的对象可能会有相同的哈希码,这是一种允许的冲突情况,但应尽可能减少冲突以优化哈希表的性能。 Java的`Objects.equals()`和`Objects.hash()`方法是帮助我们更安全地处理`equals()`和`hashCode()`...

Global site tag (gtag.js) - Google Analytics