Re: 關於HashSet 加入重覆物件卻成功加入的問題

看板java作者 (隱者)時間19年前 (2006/04/27 17:50), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/9 (看更多)
※ 引述《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
文章代碼(AID): #14K9F9Js (java)
討論串 (同標題文章)
文章代碼(AID): #14K9F9Js (java)