1. 程式人生 > >hashset中hashcode和equals方法

hashset中hashcode和equals方法

equals和hashcode
在hashset中,加入元素先判斷兩個物件的hashcode是否相等,在判斷equals是否相等,以為equals效率低,用hashcode判斷可以減少equals的呼叫次數,增加效率。物件的equals方法如果沒重寫預設繼承object,object中equals方法return ==,所以沒重寫的物件比較的是地址值,所以equals相等的物件hashcode一定相等,換句話說,先判斷hashcode的值來判斷兩個物件是否相等,只有hashcode值相等的情況下才會判斷equals是否相等,所以equals方法都判斷相等了前提的hashcode一定相等,但是擁有相同的hashcode值的物件不一定是同一個物件,同理如果hashcode不想等那麼一定不是同一個物件,當然equals不同的物件hashcode值也可能相同。
String重寫了equals方法使得他們比較的是其中的內容是否相等,如果內容相等就返回true,這麼做有什麼用呢,在hashset中不允許存在重複的值,但是如果是new String(“1”)和new String(“1”)都放進去,如果不重寫equals方法,那麼預設繼承object的equals方法,比較地址值是否相同,顯然不同,但是在我們看來這兩個物件明視訊記憶體儲的資料是相同的,違背了set集合不能存取重複元素的規則,所以這時候我們要重寫equals方法,使得他們比較其值相同就認為是同一個物件來完成set集合中不能儲存相同元素的功能,實現程式碼如下:
首先肯定先要重寫hashcode方法,如果是hashset的話,以為效率嘛,前面說到過hashcode方法效率比equals方法高;
hashcode(){
return this.name*10;

然後當hashcode值相同時候進入equals真正的判斷是否是同一個值
equals(Object obj){
首先是object中的判斷
if(this==obj) return ture;
然後判斷是否是不同的物件型別,因為型別不同其值肯定沒有比較的意義,因為不是同一個物件,只有同一個物件才比較其值相同才能說明這個物件是同一個物件。
if(!this instanceof obj)或者if(this.class!=obj.class)return false;
最後就是當型別相同的時候比較物件中的值是否相等,由於傳入過來的是obj型別首先轉換為同一型別才能呼叫其中的方法來取其中的值
obj = (this.class)obj;
return this.name==obj.name&&this.age==obj.age;

這樣就完成了比較兩個物件的值相同就可以判斷兩個物件相同,適用於hashset集合中。