[J2SE] Java HashSet觀念請教

看板java作者 (就是要戰腦殘保險業務)時間16年前 (2008/05/02 12:43), 編輯推噓6(603)
留言9則, 2人參與, 最新討論串1/2 (看更多)
各位先進午安,請教一個HashSet觀念: import java.util.*; class KeyMaster { public int i; public KeyMaster(int i) { this.i = i; } public boolean equals(Object o) { return i == ((KeyMaster)o).i; } public int hashCode() { return i; } } public class MapIt { public static void main(String[] args) { Set<KeyMaster> set = new HashSet<KeyMaster>(); KeyMaster k1 = new KeyMaster(1); KeyMaster k2 = new KeyMaster(2); set.add(k1); set.add(k1); set.add(k2); set.add(k2); System.out.print(set.size() + ":"); //k2.i = 1; System.out.print(set.size() + ":"); set.remove(k1); System.out.print(set.size() + ":"); set.remove(k2); System.out.print(set.size()); } } 結果是2:2:1:0,沒有問題;但如果我把//k2.i = 1;這行程式Enable, 結果會變成2:2:1:1。請問,這裡面造成變化的原因是?謝謝回答! -- 天堂保險公司 PTT通訊處 半調子保險顧問 Harifucks E-mail: harifucks@ptt.cc -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.81.151.145 ※ 編輯: Harifucks 來自: 219.81.151.145 (05/02 12:43)

05/02 12:57, , 1F
詳細原理過程我不是那麼瞭解 但基本上是因為你改寫了
05/02 12:57, 1F

05/02 13:01, , 2F
hashCode這個方法 因為在remove時應是利用物件的hashcode
05/02 13:01, 2F

05/02 13:03, , 3F
而你改寫了hashCode方法 變成每次hashCode回傳值都為i
05/02 13:03, 3F

05/02 13:05, , 4F
這個i又是可能變動,和當時物件存入時所用的索引不相同,因
05/02 13:05, 4F

05/02 13:07, , 5F
此雜湊出來的值自然找不到物件所在set的位置
05/02 13:07, 5F

05/02 14:06, , 6F
我認為這種程式是要讓已經懂 Hash 的人加深或釐清觀念,
05/02 14:06, 6F

05/02 14:08, , 7F
如果還不懂 Hash 的原理,看這程式是沒有意義的
05/02 14:08, 7F

05/02 14:20, , 8F
我覺得這應該又是個SCJP考題 懂不懂Hash原理是其次 主要
05/02 14:20, 8F

05/02 14:21, , 9F
是要考懂不懂怎麼運作的
05/02 14:21, 9F
文章代碼(AID): #186flNeF (java)
文章代碼(AID): #186flNeF (java)