【问题标题】:Relationship between equals and compareTo methodsequals 和 compareTo 方法之间的关系
【发布时间】:2015-08-04 15:56:51
【问题描述】:
public abstract class Fruit implements Comparable<Fruit> {

   protected String name;
   protected int size;
   protected Fruit(String name, int size){
      this.name = name;
      this.size = size;
   }
   public int compareTo(Fruit that){
       return  this.size < that.size ? - 1:
       this.size == that.size ? 0 : 1;
   }
}
class Apple extends Fruit {
   public Apple(int size){ super("Apple",size);
}
public class Test {

   public static void main(String[] args) {

      Apple a1 = new Apple(1); Apple a2 = new Apple(2);

      List<Apple> apples = Arrays.asList(a1,a2);
      assert Collections.max(apples).equals(a2);
   }
}

这个程序中equals()和compareTo()方法的关系是什么?

我知道当类 Fruit 实现接口 Comparable 时,它​​的主体定义中必须包含 compareTo 方法,但我不明白这个方法对调用 Collections.max(apples).equals(a2) 有什么影响。

compareTo 从哪里获取“that.size”的值?

【问题讨论】:

标签: java equals comparable compareto


【解决方案1】:
  • 您的 compareTo 方法根据 size 比较 Fruits。这是一个自定义实现。
  • Collections.max 将调用 compareTo 与集合大小相关的次数,以推断集合中的 max 项,因此调用 compareTo
  • 在您的示例中调用equals 时将调用Object#equals,因为它在Fruit 中未被覆盖。
  • 将在您的集合中的“最大”水果与您声明的第二个Apple 之间进行相等性测试,即在本例中大小为2 的相同Apple 之间。它应该返回true

【讨论】:

    【解决方案2】:

    equalscompareTo 在此代码中不会相互影响。 compareTo 方法确定哪个元素返回为max,然后代码检查该元素是否等于a2

    换句话说,它检查a2 是否是最大的苹果,因为compareTo 进行的比较只检查大小。

    compareTo 从哪里获取“that.size”的值?

    sizeFruit 类中的一个字段。在compareTo 中,thisthat 都是Fruit 的实例,因此它们都有一个size 字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多