【问题标题】:Comparing two different objects for being the same values比较两个不同的对象是否具有相同的值
【发布时间】:2016-09-15 08:47:36
【问题描述】:

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

我想检查它们的字段是否相等。我不是要检查它们是否是内存中的同一个对象(相同的引用?),因为这两个对象来自不同的列表/分别创建,所以它们不应该是这样。

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

【问题讨论】:

  • 我真的不明白你面临的问题是什么。你觉得你有“太多”的字段来覆盖.equals吗?
  • 覆盖boolean equals(Object o) 方法。
  • @Zircon 我只是想确保在这里覆盖.equals 是正确的,而不是执行object1 == object2object1.equals(object2) 或实施ComparableComparator 或其他东西.选项太多,我不确定哪个是正确的。

标签: java object compare equality


【解决方案1】:

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;
}

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

this.something.equals(m.something)

【讨论】:

    【解决方案2】:

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

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

    供您参考:

    • equals 应始终确定两个对象在概念上是否“相等”(这通常意味着它们具有相同的字段)。
    • == 比较内存位置,从而比较原始类型之间的相等性
    • Comparable 接口用于将一个对象排序在“前面”或“后面”另一个对象;可用于对数组和集合进行排序。
    • Comparator 接口类似于Comparable,但使用“第三方”对象来比较其他两个对象。如果您不希望您的对象成为 Comparable,则可以将此 Comparator 传递给集合排序方法。

    【讨论】:

      【解决方案3】:

      使用 Object.equals() 进行比较

      【讨论】:

        【解决方案4】:

        你需要在你的类中重写equal方法,比较两个类的值是否相同返回true,否则返回false。 示例:

        obj1.equals(obj2);
        

        在你的班级

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

        【讨论】:

          【解决方案5】:

          最好的方法是重写方法equals(Object),让你的IDE为你实现它。

          【讨论】:

          • 我的 IDE 似乎没有办法为我实现它? (安卓工作室)。我刚刚在public boolean equals(Object obj) 上写了@Override,检查了obj 是否是myObject 的一个实例,对其进行了类型转换,然后返回了一大串字段比较。这就是我所要做的吗?
          • 在你的问题中提供你的类定义和你的java版本,我会为你生成它
          • 我确实在 Android Studio 中看到了一个生成函数,但我不知道要使用哪个模板(IntelliJ Default、Apache commons-lang、Apache commons-lang 3、Objects.equal 和 hashCode(Guava )、java.util.Objects.equals 和 hashCode (java 7+))。
          • 以 IntelliJ 为例
          • 或者如果你使用 java 8,你可以使用 java.util.Objects.equals 和 hashCode (java 7+)
          猜你喜欢
          • 2017-07-10
          • 2022-01-18
          • 1970-01-01
          • 2017-08-06
          • 2021-03-09
          • 1970-01-01
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多