`
y806839048
  • 浏览: 1120721 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

hashCode不相等则equals一定不相等,equals相等则hashCode一定相等,覆盖equals时总要覆盖hashCode

阅读更多

这里写图片描述

再来一篇好文,Java中==和equals的区别,equals和hashCode的区别

==是运算符,用于比较两个变量是否相等。

 

equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样。Object的equals方法如下:

 

    public boolean equals(Object obj) {

        return (this == obj);

    }

 

 

 

(1)如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。 
(2)如果两个对象根据equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生相同的整数结果 
(3)从而在集合操作的时候有如下规则: 
将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。 
回过来说get的时候,HashMap也先调key.hashCode()算出数组下标,然后看equals如果是true就是找到了,所以就涉及了equals。

覆盖equals时总要覆盖hashCode 
一个很常见的错误根源在于没有覆盖hashCode方法。在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable。 
在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。 
如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。 
如果两个对象根据equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生相同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表的性能。

分享到:
评论

相关推荐

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

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

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

    本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些方法。 hashCode() 方法 hashCode() 方法是 Object 类中的一个方法,它返回对象的哈希码值。哈希码值是一个整数,它...

    hashcode()和equals()

    当两个对象相等时(根据 `equals()` 方法判断),它们的 `hashCode()` 值也应当相等,这是为了保证哈希表的正确工作。如果两个对象的 `equals()` 返回 `true`,那么它们调用 `hashCode()` 必须返回相同的值,否则...

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

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

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

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

    如果你只重写了 `equals()` 而不重写 `hashCode()`,可能会导致无法正确地将对象添加到集合或从集合中查找对象。例如,在HashMap中,如果两个键通过 `equals()` 方法判断为相等,但它们的哈希码不同,那么HashMap会...

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

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

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

    `hashCode()`方法则与`equals()`密切相关,它返回一个整数值,代表对象的哈希码,这个值是基于对象的特定状态计算出来的。在哈希表中,对象通过其哈希码快速定位。如果两个对象根据`equals()`方法判断相等,那么它们...

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

    - **一致性**:在覆盖`equals()`方法时,也需要确保同时覆盖`hashCode()`方法,并且两个方法的实现要保持一致,以避免潜在的哈希冲突问题。 - **性能考量**:在设计`hashCode()`方法时,应尽可能选择分布均匀的哈希...

    Java_重写equals()和hashCode()

    当同时重写 `equals()` 和 `hashCode()` 时,需要注意的一点是,如果 `equals()` 返回true,那么两个对象的 `hashCode()` 必须相等。反之则不一定,因为不同的对象可能会产生相同的哈希码。这就是为什么在设计类时,...

    hashcode和equals的分析

    2. **可变性**:如果两个对象的`hashCode`值相同,并不一定意味着这两个对象相等。 ### 3. 实例分析 假设我们有一个名为`Person`的类,其中包含`name`和`age`两个属性。为了使`Person`对象能够正确地工作在`...

    set接口经常用的hashCode和equals方法详解

    在这个例子中,`equals`方法根据`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode`方法也综合考虑了这两个属性,以确保`equals`方法返回`true`的对象具有相同的哈希码。 #### 七、总结 在Java中,...

    equals与hashCode方法讲解

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

    重写hashCode()和equals()方法详细介绍

    如果不重写`hashCode()`,当两个`equals()`相等的对象被放入HashSet或其他基于哈希的集合时,可能会出现意外的结果,因为哈希码不同,集合可能无法识别这些对象是相同的,从而导致错误的添加或查找行为。 总之,...

    equals,hashcode,toString

    当两个对象通过`equals()`方法判断为相等时,它们的`hashCode()`方法返回值也应该相等。反之,如果两个对象不相等,它们的哈希码应该尽可能不同,以减少哈希冲突的概率。因此,重写`equals()`时,通常也需要重写`...

    javahashcode()和equals()和==的介绍和区别.pdf

    1. 如果`hashCode()`返回的值不同,那么两个对象被认为是不相等的,因为它们不会映射到同一个哈希桶,从而减少了比较`equals()`的需要。 2. 如果`hashCode()`返回的值相同,那么需要进一步使用`equals()`进行比较。...

    equals与hashCode在实际开发中的重写写法

    2. 不相等的对象可能具有不同的哈希码:如果 x.equals(y) 返回 `false`,则 x.hashCode() 和 y.hashCode() 未必不同,但这样做可以提高哈希表的性能。 在重写 `hashCode()` 时,要确保它和 `equals()` 方法保持一致...

Global site tag (gtag.js) - Google Analytics