我有兩個MyObject類型的對象。他們的私人領域有像Integer, int, Long, long, String
等東西 - 沒有花哨的子對象或任何這種效果。將兩個不同的對象比較爲相同的值
我想檢查它們的字段是否相等。我不想檢查它們是否是內存中的同一個對象(相同的引用?),它們不應該是這樣,因爲這兩個對象來自單獨的列表/單獨創建。
檢查一個對象的所有字段是否與第二個對象的所有其他字段具有相同值的正確方法是什麼?
我有兩個MyObject類型的對象。他們的私人領域有像Integer, int, Long, long, String
等東西 - 沒有花哨的子對象或任何這種效果。將兩個不同的對象比較爲相同的值
我想檢查它們的字段是否相等。我不想檢查它們是否是內存中的同一個對象(相同的引用?),它們不應該是這樣,因爲這兩個對象來自單獨的列表/單獨創建。
檢查一個對象的所有字段是否與第二個對象的所有其他字段具有相同值的正確方法是什麼?
最好的方法是覆蓋方法equals(Object)
並讓你的IDE
爲你實現它。
我的IDE似乎沒有辦法爲我實現它? (Android Studio)。我剛剛在'public boolean equals(Object obj)'上寫了@Override,檢查'obj'是否是'myObject'的一個實例,對它進行了類型化,然後返回一個大的連續的字段比較。這是我需要做的嗎? –
我也讀過,我必須做一些與HashCode? –
在您的問題和您的java版本中提供您的字段定義,我將爲您生成它 –
您需要重寫您的類中的equal方法,並比較兩個類的值是否相同return true else false。 例如:
obj1.equals(obj2);
在類
@Override
public boolean equals(YourClass obj) {
// compare the values of both objets.
// return true on success;
}
使用的Object.Equals()比較
重寫Object
的equals
方法是適合您的情況最好的選擇。您可以確保對象每個字段的等同性,也可以比較您知道唯一的字段或字段組合。
如果您使用Map
這樣的集合,則可以考慮重寫hashcode
而不是使用這些字段,然後比較equals
方法中的哈希碼。
供您參考:
equals
應該總是確定兩個對象在概念上「平等」(這通常意味着它們具有相同的字段)。==
比較原始類型Comparable
接口被用於排序的對象「超前」或「後面」另一個目的之間的存儲器位置,並且因此平等;對排序數組和集合很有用。Comparator
接口類似於Comparable
,但使用「第三方」對象來比較兩個其他對象。如果您不希望您的對象是Comparable
,則可以將Comparator
傳遞到收集排序方法中。mDo as @Raj K recommended。例如,如果您有:
public class MyObject {
int i1;
long l1;
long i2;
// and a bunch of c'tors and methods
}
那麼你的equals()方法會是這樣的
public Boolean equals(Object o) {
if (o instanceof MyObject) {
MyObject m = (MyObject)o;
return (i1==m.i1) && (l1==m.l1) && (l2==m.l2);
}
return false;
}
如果您的字段是對象,你要小心了,因爲你還必須先檢查是否爲空,然後再檢查是否
this.something.equals(m.something)
我真的不明白你面臨的問題是什麼。你覺得你有「太多」的領域來覆蓋'.equals'嗎? – Zircon
重寫'boolean equals(Object o)'方法。 – Kayaman
@Zircon我只是想確保覆蓋'.equals'是正確的事情在這裏做,而不是做'object1 == object2'或'object1.equals(object2)'或實現'Comparable'或'Comparator'或者其他的東西。選項太多,我不確定哪個是正確的。 –