比较两个不同的对象是否具有相同的值

Comparing two different objects for being the same values

我有两个 MyObject 类型的对象。他们的私人领域有 Integer, int, Long, long, String 等东西——没有花哨的子对象或任何类似的东西。

我想检查一下它们的字段是否相等。我不想检查它们是否是内存中的同一个对象(同一个引用?),无论如何它们不应该是因为这两个对象来自不同的列表/单独创建。

检查一个对象的所有字段是否与第二个对象的所有其他字段具有相同值的正确方法是什么?

最好的方法是覆盖方法 equals(Object) 并让您的 IDE 为您实现它。

您需要重写 class 中的 equal 方法并比较两个 class 的值是否相同 return true 否则 false。 示例:

obj1.equals(obj2);

在你的class

@Override
public boolean equals(YourClass obj) {
    // compare the values of both objets.
    // return true on success;
}

使用Object.equals()比较

重写 Objectequals 方法是适合您情况的最佳选择。您可以确保对象的每个字段都相等,或者您可以只比较您知道唯一的字段或字段组合。

如果您使用 Map 等集合,您可以考虑使用这些字段覆盖 hashcode,然后在 equals 方法中比较哈希码。

供您参考:

  • equals 应该始终确定两个对象在概念上是否 "equal"(这通常意味着它们具有相同的字段)。
  • == 比较内存位置,因此原始类型之间的相等性
  • Comparable接口用于订购一个对象"ahead"或"behind"另一个对象;对数组和集合排序很有用。
  • Comparator 接口类似于 Comparable 但使用 "third-party" 对象来比较其他两个对象。如果您不希望您的对象是 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;
}

如果您的任何字段是对象,您必须更加小心,因为在检查是否

之前您还必须先检查空值
this.something.equals(m.something)