作者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:
[email protected]
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.81.151.145
※ 编辑: Harifucks 来自: 219.81.151.145 (05/02 12:43)
1F:推 choufeng:详细原理过程我不是那麽了解 但基本上是因为你改写了 05/02 12:57
2F:推 choufeng:hashCode这个方法 因为在remove时应是利用物件的hashcode 05/02 13:01
3F:推 choufeng:而你改写了hashCode方法 变成每次hashCode回传值都为i 05/02 13:03
4F:→ choufeng:这个i又是可能变动,和当时物件存入时所用的索引不相同,因 05/02 13:05
5F:推 choufeng:此杂凑出来的值自然找不到物件所在set的位置 05/02 13:07
6F:推 tkcn:我认为这种程式是要让已经懂 Hash 的人加深或厘清观念, 05/02 14:06
7F:→ tkcn:如果还不懂 Hash 的原理,看这程式是没有意义的 05/02 14:08
8F:推 choufeng:我觉得这应该又是个SCJP考题 懂不懂Hash原理是其次 主要 05/02 14:20
9F:→ choufeng:是要考懂不懂怎麽运作的 05/02 14:21