equals 和 compareTo 方法之间的关系

Relationship between equals and compareTo methods

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() 方法之间的关系是什么?

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

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

  • 您的 compareTo 方法根据 size 比较 Fruit。这是一个自定义实现。
  • Collections.max 将根据 collection 的大小调用 compareTo 多次,以推断 collection 中的 max 项目,因此 compareTo 被调用。
  • 在您的示例中调用 equals 时将调用
  • Object#equals,因为它在 Fruit 中未被覆盖。
  • 将在您的 collection 中的 "largest" 水果和您声明的第二个 Apple 之间测试相等性,即在大小为 [= 的相同 Apple 之间22=] 在这种情况下。应该 return true.

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

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

And from where compareTo takes the value of "that.size"?

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