一、需要重寫的情況
加入到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;
}