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
.
equals
和compareTo
在这段代码中互不影响。 compareTo
方法确定哪个元素作为 max
返回,然后代码检查该元素是否等于 a2
.
换句话说,它正在检查 a2
是否是最大的苹果,因为 compareTo
所做的比较只检查大小。
And from where compareTo takes the value of "that.size"?
size
是 Fruit
class 中的一个字段。在 compareTo
中,this
和 that
都是 Fruit
的实例,因此它们都有一个 size
字段。
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
被调用。
在您的示例中调用 Object#equals
,因为它在Fruit
中未被覆盖。- 将在您的 collection 中的 "largest" 水果和您声明的第二个
Apple
之间测试相等性,即在大小为 [= 的相同Apple
之间22=] 在这种情况下。应该 returntrue
.
equals
时将调用 equals
和compareTo
在这段代码中互不影响。 compareTo
方法确定哪个元素作为 max
返回,然后代码检查该元素是否等于 a2
.
换句话说,它正在检查 a2
是否是最大的苹果,因为 compareTo
所做的比较只检查大小。
And from where compareTo takes the value of "that.size"?
size
是 Fruit
class 中的一个字段。在 compareTo
中,this
和 that
都是 Fruit
的实例,因此它们都有一个 size
字段。