`

重写equals时,需要重写hashcode

    博客分类:
  • java
阅读更多
   重写对象的equals方法时,需要重写hashcode。因为两个对象equals的时候,他的hashcode应该是保持一致的。
   在set中,元素不允许重复。这个重复是根据对象的内存地址判断的,对于只重写了equals方法的两个实体,equlas比较相等,那这两个对象也可能会放入set中,因为其hashcode可能会不一致。


1.下面是一个java类,重写了equals,但是没有重写hashcode
package compare_equals_hashCode;

public class UserInfo {

private String userName;
private int userAge;

public UserInfo(String userName, int userAge) {
super();
this.userName = userName;
this.userAge = userAge;
}

@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
UserInfo userinfo = (UserInfo) obj;
if (userName.equals(userinfo.getUserName())
&& userAge == userinfo.getUserAge())
return true;
return false;
}

@Override
public String toString() {
// TODO Auto-generated method stub
// return super.toString();
return "UserInfo UserName:" + getUserName() + "UserAge:" + getUserAge();
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public int getUserAge() {
return userAge;
}

public void setUserAge(int userAge) {
this.userAge = userAge;
}

}

2.下面是一个测试类
public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
UserInfo i1 = new UserInfo("zz", 11);
UserInfo i2 = new UserInfo("zz", 11);

Set s = new HashSet();
s.add(i1);
s.add(i2);
// 判断i1的内容是否和i2的相等
System.out.println(i1.equals(i2));
// i1的hashCode
System.out.println(i1.hashCode());
// i2的hashCode
System.out.println(i2.hashCode());
// S 集合的元素个数
System.out.println(s.size());
}

}
3.输出结果

true
6413875
21174459
2

4.可以发现,输出的结果中hashcode不一致,所以I1和I2两个内容相同的对象都成功放入了set集合中。

分享到:
评论

相关推荐

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

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

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

    Java_重写equals()和hashCode()

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

    关于重写equals,hashcode以及compareTo方法!

    需要注意的是,在重写equals()方法时,我们需要遵守一些规则,如对称性、反射性、类推性、一致性等。违反这些规则可能会出现意想不到的结果。 hashcode()方法是Object类中的另一个方法,它用于生成对象的哈希码。...

    重写equals方法

    第一种情况:如果类中提供的 equals 方法无法满足需求,则需要重写 equals 方法。例如,在 String 类中,equals 方法用于比较两个字符串的内容是否相同,而不是比较它们的引用。 第二种情况:对于采用哈希算法的...

    why在重写equals时还必须重写hashcode方法分享

    总结来说,重写 `equals()` 时同时重写 `hashCode()` 是为了保持一致性(保证相等对象的哈希码相同)并优化性能(减少哈希冲突,提高哈希表操作效率)。在设计类时,特别是涉及到对象比较和存储的场景,务必考虑这两...

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

    因此,当重写`equals()`时,通常也需要重写`hashCode()`,以保持两者的一致性。不这样做可能会导致哈希表的行为异常,例如在HashSet中,即使两个对象相等,也可能无法正确识别它们。 例如,假设我们有一个`Coder`类...

    为什么重写equals方法,还必须要重写hashcode方法

    为什么重写equals方法,还必须要重写hashcode方法

    java中为何重写equals时必须重写hashCode方法详解

    当我们在自定义类中重写 `equals()` 方法时,通常也需要重写 `hashCode()` 方法,这是为了遵循一些重要的原则和保证数据结构如 `HashMap`、`HashSet` 的正确行为。 首先,`equals()` 方法用于比较两个对象是否相等...

    面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗?

    这就是为什么在重写 `equals()` 时,通常也需要重写 `hashCode()`。 来看看 `String` 的 `hashCode()` 源码: ```java public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] =...

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    Java 中重写 equals() 方法的同时要重写 hashCode() 方法的重要性 在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否...

    Java重写equals及hashcode方法流程解析

    "Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object...同时,我们还需要注意到,重写equals方法时,必须重写hashCode方法,以便于确保对象的正确性和一致性。

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

    在使用 `HashSet`、`HashMap` 等数据结构时,如果重写了 `equals()` 方法但没有重写 `hashCode()` 方法,可能会导致预期的行为不一致。因为这些数据结构依赖于 `hashCode()` 来确定对象的存储位置,而 `equals()` 来...

    为什么在重写 equals方法的同时必须重写 hashcode方法

    因此,为了保证对象在集合中的正确行为,当重写 `equals` 方法时,必须同时重写 `hashCode` 方法,确保相等的对象具有相同的哈希值。这样,集合可以正确地识别和处理相等的对象,避免数据一致性问题。同时,遵循这个...

    【面试】hashCode与equals两者之间的关系 / == 和equals / 为什么要重写equals方法 / 重写equals /hashcode方法 / 为什么要重写hashCode方法

    6、**何时需要重写hashCode()方法?** 当重写了`equals()`方法时,通常也需要重写`hashCode()`。因为如果不这样做,当两个对象根据`equals()`相等但`hashCode()`不同时,将违反哈希表的性质,导致不期望的行为。 7...

    如何在IDEA中对 hashCode()和 equals() 利用快捷键快速进行方法重写

    重写`equals()`和`hashCode()`的目的是确保在使用如HashSet这样的集合时,如果两个对象被视为相等(即`equals()`返回`true`),那么它们的`hashCode()`也应该相同。这是因为HashSet依赖于`hashCode()`来确定对象在...

    equals方法的重写.docx

    #### 二、为什么需要重写equals方法? 1. **提高程序效率**:当两个对象具有相同的业务逻辑上的“身份”时,它们应该被认为是相等的。 2. **增强代码可读性**:重写后的`equals`方法可以根据实际需求来判断对象是否...

    java中重写equals和重写hashCode()

    总结来说,当重写 `equals()` 方法以比较对象内容时,也需要重写 `hashCode()` 方法以保持对象平等性和哈希码的一致性。这样可以确保散列数据结构能够正确处理相等的对象,防止出现不应有的重复元素。对于 Java ...

    关于重写equals()为什么一定要重写hashcode()自己的一点心得

    首先我们看下下面代码及输出和String重写equals和hashcode的源码: package com.zzy.test; public class Test6 { public static void main(String[] args) { String s1="aaa"; String s2="aaa"; String s3=new ...

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

    默认情况下,`hashCode()` 返回对象的内存地址的某种表示,但通常我们需要重写这个方法,使得具有相同逻辑内容的对象返回相同的哈希码。 2. **equals()**:同样来自Object类,它用于比较两个对象是否相等。默认行为...

Global site tag (gtag.js) - Google Analytics