作者qrtt1 (隐者)
看板java
标题Re: 关於HashSet 加入重覆物件却成功加入的问题
时间Thu Apr 27 17:51:29 2006
※ 引述《Jnaive (嘿嘿)》之铭言:
: ※ 引述《Bluesky7 ()》之铭言:
: : class A{
: : int a=0;
: : public A(int va){a=va;}
: : public boolean equals(Object o){
: : A m=(A)o;
: : return (a==o.a);
: : }
: : public String toString(){...return a 的String}
: : }
: : class test{
: : main(String[] argc)
: : {
: : HashSet<A> set= new HashSet<A>();
: : set.add(new A(1));
: : set.add(new A(2));
: : System.out.println(set);
: : }
: : }
: : 结果印出来是 [1, 2] 第二次被成功加入了
: : 可是SUN 的 Spec上明明定义set 重复的不会加入
: : More formally, adds the specified element, o, to this set if this set
: : contains no element e such that (o==null ? e==null : o.equals(e)).
: : 可是现在看来 好像只有把address相同的才看成一样 可是我的equals也overrinding了
: : 也测过没错
: : 我哪里弄错了吗
: : 请教板友 谢谢
: 在head first java 那本书上看到过这问题
: class A 还需要overrinding过另一个hashCode()这个method
: 物件相等,似乎是先检查物件的hashCode,然後才呼叫equal
: 都相等,才算物件相等
: 不是很确定…有错请指正
import java.util.HashSet;
public class TasteHashSet {
public static void main(String[] args) {
Object o = new Object() {
public int hashCode() {
System.out.println("Call hashCode()");
return super.hashCode();
}
public boolean equals(Object obj) {
System.out.println("Call equals()");
return super.equals(obj);
}
};
HashSet hash = new HashSet() {
public boolean add(Object o) {
System.out.println("Do Add A Element");
return super.add(o);
}
};
hash.add(o);
}
}
俺好奇到底谁先呼叫, 是equals还是hashCode
写了程式测了一下, 结果..hahaha
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.26.34.20