重写equals时,需要重写hashcode

重写对象的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集合中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值