【问题标题】:If objects of same class are identical如果同一类的对象相同
【发布时间】:2021-01-22 00:19:25
【问题描述】:

我有一个有 15 个数据成员的 java 类。 我有 2 个该类的对象。 我想检查这两个对象是否相同。 比较每个数据成员非常耗时。 有没有更好的方法

【问题讨论】:

  • 相同是什么意思?在什么基础上它会被认为是相同的?
  • “耗时”是什么意思?写代码?运行代码?
  • 如果不比较每个字段,如何判断它们是否相等?不过,您可以尽早完成,只要您发现一个领域不同。
  • 除非您通过基准测试或分析进行了一些实际测量,否则切勿使用“耗时”一词。在 90% 的情况下,对性能的猜测是错误的。
  • 1.通过相同,我的意思是数据成员具有相同的值。2.假设我有 1000 个具有唯一 ID 的对象存储在一个表中。相同的 1000 个对象通过某个调度程序再次出现,并检查这些值是否具有是否已更改。3.因此它将所有这 1000 个对象与表中存在的对象进行比较,并基于该值将在表中更新。4.因此,在此过程中,如果我比较每个字段,将消耗更多时间。跨度>

标签: java string performance string-comparison


【解决方案1】:

如果你的意思是“它需要大量的 CPU 时间”——不,它不会。它只是比较一大堆位,而这正是您想要做的,所以,只需这样做:比较每个字段。

如果您的意思是“需要大量编写”,IDE 可以自动生成这些内容,但是您必须查看、维护它,当您添加字段时遇到麻烦并忘记更新那些样板文件。因此,您可以改用Project Lombok@Value@EqualsAndHashCode 功能。

【讨论】:

    【解决方案2】:

    您可以覆盖equals 方法,以便在相同类型的两个实例之间编写您自己的自定义比较器。有关更多信息,请参阅此 Spring documentation。另外,请参阅rzwitserloot 的答案,简单地使用 Lombok 注释自动为您生成此 equals 方法。

    public class MyClass {
      private String dataField1;
      private String dataField2;
      // declare remaining 13 instance level data fields
    
      @Override
      public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyClass that = (MyClass) o;
    
        return dataField1.equals(that.dataField1) &&
              dataField2.equals(that.dataField2);
        // Compare remaining 13 instance fields
      }
    }
    

    然后你可以使用这个equals方法比较两个实例:

    MyClass m1 = new MyClass();
    MyClass m2 = new MyClass();
    
    System.out.println(m1.equals(m2));
    

    【讨论】:

      【解决方案3】:

      来自您的评论

      假设我有 1000 个具有唯一 ID 的对象存储在一个表中。相同 1000 个对象通过某个调度程序再次出现,它检查是否 值是否已更改。

      我了解每个对象都会与其存储的版本进行一次比较。在这个用例中,没有比比较字段更好的方法了。

      想到的一个想法是使用从字段值派生的哈希码。如果哈希码不同,则字段也必须不同。这仅通过一个整数比较来完成。如果哈希码相同,您仍然需要检查字段值,因为可能存在冲突:不同的对象导致相同的哈希码。

      但我想,在任何步骤中,相当大比例的对象都没有改变它们的值。所以,引入哈希码只能改善“变化”的情况,计算一个哈希码可能比比较两个对象需要更长的时间。

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 2018-06-17
        • 1970-01-01
        • 2016-04-22
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 2018-11-03
        • 2013-05-23
        相关资源
        最近更新 更多