在Java中比较两个不同对象/类实例的内容的有效方法是什么?

时间:2017-06-01 23:16:35

标签: java

我必须比较两个类实例的内容:不是完整的,而是某些字段。这些课程不完全相同;这两个类都有不同的成员元素。

示例:

finally
{
    reader?.Close(); // reader can be null so cater for it
}

我想比较字符串" a"的值。在Apple中,使用Class p。中的字符串值

比较内容的低效方法是使用getter方法,直到达到感兴趣的值。

在多个字段上多次进行此类比较的有效方法是什么?

1 个答案:

答案 0 :(得分:0)

如果你的getter只是返回字段的值,那么它们通常会被 1 内联。如果发生这种情况,那么你认为效率低下的比较方法就会尽可能高效。

(警告:您的问题“气味”过早优化。您是否有确凿的证据证明这些比较确实是性能瓶颈?您是否描述过您的代码?如果没有,那么很有可能你正试图优化无关紧要的东西。那就是浪费精力。)

但是,如果这还不够好,您可以添加一个自定义比较方法,仅测试您感兴趣的字段; e.g。

public boolean myEquals(MyType other) {
    return this.field1.equals(other.field1) && this.field2 == other.field2;
}

进一步优化的想法:

  1. 按照您首先测试最有可能不同的字段的顺序比较字段。
  2. 如果可能经常将对象与自身进行比较,请考虑使用this == other作为短路。
  3. 如果对象很可能被重复测试,并且任何给定比较的结果可能都是错误的,请考虑添加一个字段来保存(仅)您正在测试的字段的自定义哈希字段,并将其用作加速器。
  4. 但请注意,上述想法只能提高特定用例的平均性能。在其他情况下,他们可以使性能变差。

    1 - JIT编译器不会内联调用太大或需要调度的方法;即“虚拟”函数调用,用C ++的说法。