重写equals时,需要重写hashcode_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 重写equals时,需要重写hashcode

重写equals时,需要重写hashcode

 2013/11/30 0:26:46  luobingxtu  程序员俱乐部  我要评论(0)
  • 摘要:重写对象的equals方法时,需要重写hashcode。因为两个对象equals的时候,他的hashcode应该是保持一致的。在set中,元素不允许重复。这个重复是根据对象的内存地址判断的,对于只重写了equals方法的两个实体,equlas比较相等,那这两个对象也可能会放入set中,因为其hashcode可能会不一致。1.下面是一个java类,重写了equals,但是没有重写hashcodepackagecompare_equals_hashCode;publicclassUserInfo
  • 标签:has Hash
   重写对象的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集合中。

发表评论
用户名: 匿名