Discussion:
[問題] 請問要如何比較兩個物件?
(时间太久无法回复)
市政府7F
2006-09-20 23:52:11 UTC
Permalink
C c1 = new C();
C c2 = new C();

因為是指向不同物件的關係
若是用 if (c1 == c2) or c1.equals(c2)得到的結果都將會是false;

可是若兩個物件是相同但不同個
比方說都是c1 and c2都是load同一個檔案
要如何去判斷兩個物件是相同但是是個別的兩個物件呢?
謝謝



--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.69.40.253
小安
2006-09-21 00:13:53 UTC
Permalink
※ 引述《teamspike (市政府7F)》之銘言:
: C c1 = new C();
: C c2 = new C();
: 因為是指向不同物件的關係
: 若是用 if (c1 == c2) or c1.equals(c2)得到的結果都將會是false;
: 可是若兩個物件是相同但不同個
: 比方說都是c1 and c2都是load同一個檔案
: 要如何去判斷兩個物件是相同但是是個別的兩個物件呢?
: 謝謝

如果這個 C 是你自己寫的物件
你必須自己定義什麼叫做 "相同"
也就是 override equals method

例如: public boolean equals(C c){
return this.value == c.value;
}

如果你沒有這麼做,
則將會繫結至 Object.equals()
而 Object.equals() 又是以 hashCode 作判斷....hmm..

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.126.173.31
良葛格
2006-09-21 16:18:54 UTC
Permalink
※ 引述《teamspike (市政府7F)》之銘言:
: C c1 = new C();
: C c2 = new C();
: 因為是指向不同物件的關係
: 若是用 if (c1 == c2) or c1.equals(c2)得到的結果都將會是false;
: 可是若兩個物件是相同但不同個
: 比方說都是c1 and c2都是load同一個檔案
: 要如何去判斷兩個物件是相同但是是個別的兩個物件呢?
: 謝謝

==是比較兩個參考名稱參考的是不是同一個實例…
equals()是您自己定義物件的相等性…
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/ObjectClass.htm

--
良葛格學習筆記
http://caterpillar.onlyfun.net/Gossip/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.104.173.188
a***@kkcity.com.tw
2006-09-22 17:41:56 UTC
Permalink
Post by 小安
如果這個 C 是你自己寫的物件
你必須自己定義什麼叫做 "相同"
也就是 override equals method
例如: public boolean equals(C c){
return this.value == c.value;
}
如果你沒有這麼做,
則將會繫結至 Object.equals()
而 Object.equals() 又是以 hashCode 作判斷....hmm..
沒記錯的話, Object.equals() 並非以hashCode 作判斷.
只是單純檢查是不是同一個 instance 而已

Alien
--
┌─────◆KKCITY◆─────┐ ★  人人可架站,經營社群聯誼天地  ★
│ bbs.kkcity.com.tw │ 歡迎社團/班系/歌友/藝文創作/公益申請
└──《From:218.103.237.241 》──┘ 到 KKCity 開設自己喜愛的主題BBS站
--
kevingo
2006-09-23 07:06:12 UTC
Permalink
以單純沒有被覆寫(Override)的equals()方法來說,他是比較兩個物件在stack
記憶體區塊中的內容是否相等。也就是比較兩個物件的object reference。

至於要怎麼樣比較,這樣就是歸類到business logic的範圍當中,必須要由
程式設計師自己來定義。


※ 引述《***@kkcity.com.tw ( )》之銘言:
: ※ 引述《***@ptt.cc (小安)》之銘言:
: > 如果這個 C 是你自己寫的物件
: > 你必須自己定義什麼叫做 "相同"
: > 也就是 override equals method
: > 例如: public boolean equals(C c){
: > return this.value == c.value;
: > }
: > 如果你沒有這麼做,
: > 則將會繫結至 Object.equals()
: > 而 Object.equals() 又是以 hashCode 作判斷....hmm..
: 沒記錯的話, Object.equals() 並非以hashCode 作判斷.
: 只是單純檢查是不是同一個 instance 而已
: Alien


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.165.120.21
※ 編輯: kevingo 來自: 218.165.120.21 (09/23 23:06)
遺憾太常。
2006-09-23 11:34:35 UTC
Permalink
equals()的實做在Effective Java裡講得很清楚,
可以去找來看。

如果直接實做 c1== c2 或者 c1.equals(c2) ,
會比較兩者的memory addr.,
既然是兩個物件,那當然會是false,
除非在Class C裡你已經做出singleton,
(private constructor,getInstance之類的)
這樣兩者怎麼比較都是同一個。

對於你的問題,
最簡單的答案當然是override public boolean equals(),
然後比較裡面的data;
粗看起來你的資料應該沒有inheritance的架構,
不過要小心把你這些資料丟到hash-based 的collection,
如果這樣的話就要再override hashCode()。

比較安全的equals()如下:

public boolean equals(Object obj)
{
// 檢查兩者是不是同一個reference
if(this == obj)
return true;

// 檢查obj 是不是 C 物件的instance
// 如果 C 物件跟其他物件有繼承關係,
// 這一行比較很重要
if (!(obj instanceof C))
return false;

// 檢查C裡面的資料
C tmp = (C) obj;
return tmp.data == data && ... ;
}

然後實做hashCode(),
詳情請參見Effective Java...。

※ 引述《teamspike (市政府7F)》之銘言:
: C c1 = new C();
: C c2 = new C();
: 因為是指向不同物件的關係
: 若是用 if (c1 == c2) or c1.equals(c2)得到的結果都將會是false;
: 可是若兩個物件是相同但不同個
: 比方說都是c1 and c2都是load同一個檔案
: 要如何去判斷兩個物件是相同但是是個別的兩個物件呢?
: 謝謝

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 66.108.81.124

Loading...