看板 java 關於我們 聯絡資訊
各位先進午安,請教一個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)
choufeng:詳細原理過程我不是那麼瞭解 但基本上是因為你改寫了 05/02 12:57
choufeng:hashCode這個方法 因為在remove時應是利用物件的hashcode 05/02 13:01
choufeng:而你改寫了hashCode方法 變成每次hashCode回傳值都為i 05/02 13:03
choufeng:這個i又是可能變動,和當時物件存入時所用的索引不相同,因 05/02 13:05
choufeng:此雜湊出來的值自然找不到物件所在set的位置 05/02 13:07
tkcn:我認為這種程式是要讓已經懂 Hash 的人加深或釐清觀念, 05/02 14:06
tkcn:如果還不懂 Hash 的原理,看這程式是沒有意義的 05/02 14:08
choufeng:我覺得這應該又是個SCJP考題 懂不懂Hash原理是其次 主要 05/02 14:20
choufeng:是要考懂不懂怎麼運作的 05/02 14:21