重写对象的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集合中。