【问题标题】:Comparator interface's equals method, why it is always safe not to override Object.equals(Object)Comparator 接口的 equals 方法,为什么不覆盖 Object.equals(Object) 总是安全的
【发布时间】:2018-04-12 02:05:03
【问题描述】:

我目前正在研究Comparator 接口,并注意到在Comparator's equals 方法的文档中,它指出

请注意,不要覆盖 Object.equals(Object) 总是安全的

我已经检查了Object 类中默认equals 方法的实现

因此使用equals 方法的默认实现,它只是检查两个实例是否指向同一个对象,因为this == obj 测试引用是否相等。

但是如果我有两个Comparator 实例会发生什么,它们返回的结果是相同的,我想知道它们是否相等。如果我不覆盖默认的Object's equals 方法,那么无论它们返回的结果是否相等,通过使用默认的Object's equals 方法,将始终返回false。那么是否仍然不覆盖 Object.equals(Object) 总是安全的?

【问题讨论】:

  • 你不应该期望比较器覆盖equals()。这只是一种可能的优化。
  • @shmosel 因此可以比较Comparator 的两个实例并返回false,即使它们的实现相同?
  • 如果他们是==,则不是,否则是。
  • 好的,感谢您的帮助:)
  • Comperator 是一种“排序”某些对象的方法。它有一些要求:一个对象“小于”另一个对象或“大于”另一个对象或等于。如果 Comperator 返回 0(两个对象相等),equal 应该返回 true,但这不是必需的。

标签: java equals comparator


【解决方案1】:

我想你误解了 java 文档的意思:

这个方法可以返回真只有如果指定的对象也是一个比较器并且它强加与这个比较器相同的顺序

如果是完全相同的对象,默认实现将返回 true ,根据定义,这意味着它们都(实际上是单个)提供相同的排序顺序

这个定义并不意味着它会为不同的比较器返回true,即使它们提供相同的排序顺序,简单的验证:

import java.util.Comparator;

public class TestComparator {
    static class Comparator1 implements Comparator<Integer> {
        @Override
        public int compare(final Integer o1, final Integer o2) {
            return Integer.compare(o1, o2);
        }
    }

    static class Comparator2 implements Comparator<Integer> {
        @Override
        public int compare(final Integer o1, final Integer o2) {
            return Integer.compare(o1, o2);
        }
    }

    public static void main(final String[] args) {
        final Comparator1 c1 = new Comparator1();
        final Comparator1 c11 = new Comparator1();
        final Comparator2 c2 = new Comparator2();

        System.out.println(c1.equals(c1)); // true
        System.out.println(c1.equals(c11)); // false
        System.out.println(c1.equals(c2)); // false
    }
}

默认实现可以在比较器等效的情况下返回 true,它也可以返回 false(如果对象不同)

请注意,医生说:

但是,在某些情况下,重写此方法可能会通过允许程序确定两个不同比较器施加相同的顺序来提高性能。

因此,不覆盖是安全的,但仅仅保证不同但等效的比较器将被正确比较是不够的

【讨论】:

  • 感谢您的澄清!我想我现在明白了。很难阅读和理解文档,因为它们的措辞非常简洁。感谢您的帮助!
猜你喜欢
  • 2020-04-11
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多