一、需要重写的情况
加入到HashSet中的自定义类对象,为确保他们不重复,需要对他们的类重写equals() 和 hashcode()的方法。
如果不重写equals() 方法,相同的内容不同引用的对象会被当做不同的对象被加入到hashset中
例如:自定义的类 User 参数值完全一致的情况下
User user1 = new User("张三","上海");
User user2 = new User("张三","上海");
Set(User) set = new HashSet();
set.add(user1);
set.add(user2);
//不重写equals() 和 hashcode()
set集合中存了两个值 set.size() == 2
//重写
set集合中存了一个值 set.size() == 1
注意:1、重写equals必须重写hashCode方法 因为是先比较两个对象的hash值是否相等在判断值
2、equals() 和 hashCode() 的定义必须兼容 如果 x.equals(y) 则x , y 的hashCode必须相等,
3、x , y 的 hashCode相等,x , y 不一定相等
二、重写equals() 和 hashcode() 方法
1、重写equals()
1)判断比较对象 object 是否等于自身
if(object == this) return true;
2)判断比较对象object是否是目标类型的对象 例如 User
if(!(object instanceof User)) return false;
3)类型转换成目标对象 比较 自定的字段 是否相等 全部字段都要进行比较
User u = (User)object;
return u.name.equals(name) && u.age == age;
2、重写hashCode
public int hashCode(){
int result = 17;
result = result *31 + name.hashCode();
result = result*31 + age;
return result;
}