Re: 關於HashSet 加入重覆物件卻成功加入的問題
※ 引述《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
討論串 (同標題文章)
java 近期熱門文章
PTT數位生活區 即時熱門文章