equals和compareTo方法之间的关系

时间:2015-08-04 15:56:51

标签: java equals comparable compareto

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

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

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

2 个答案:

答案 0 :(得分:1)

  • 您的compareTo方法会根据Fruitsize进行比较。这是一个自定义实现。
  • Collections.max将多次调用与您的集合大小相关的compareTo,以推断集合中的max项,从而调用compareTo
  • 在您的示例中调用Object#equals时将调用
  • equals,因为它未在Fruit中重写。
  • 将在&#34;最大&#34;之间测试平等。您的收藏中的水果,以及您声明的第二个Apple,即在此情况下,大小为Apple的同一2之间。它应该返回true

答案 1 :(得分:0)

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

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

  

从compareTo取值&#34; that.size&#34;?

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