作者Harifucks (就是要戰腦殘保險業務)
站內java
標題[J2SE] Java HashMap觀念請教
時間Fri May 2 12:43:01 2008
各位先進午安,請教一個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