我有两个类型为MyObject的对象。它们的私有字段有类似Integer, int, Long, long, String
等的东西——没有花哨的子对象或任何类似的东西。
我想检查一下它们的字段是否相等。我并没有试图检查它们是否是内存中的同一个对象(相同的引用?),因为这两个对象来自单独的列表/单独创建,所以它们不应该是。
检查一个对象的所有字段是否与第二个对象的其他字段具有相同值的正确方法是什么?
最好的方法是重写方法equals(Object)
,并让您的IDE
为您实现它。
您需要重写类中的equal方法,并比较两个类的值是否相同,返回true或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如@Raj K所建议。例如,如果您有:
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;
}
如果你的任何字段都是Object,你必须更加小心,因为在检查之前,你还必须首先检查null
this.something.equals(m.something)