java compare接口_Java提高篇(三八)-Java集合细节(四):保持compareTo和equals同步 - Java 技术驿站-Java 技术驿站...

在Java中我们常使用Comparable接口来实现排序,其中compareTo是实现该接口方法。我们知道compareTo返回0表示两个对象相等,返回正数表示大于,返回负数表示小于。同时我们也知道equals也可以判断两个对象是否相等,那么他们两者之间是否存在关联关系呢?

public class Student implements Comparable{

private String id;

private String name;

private int age;

public Student(String id,String name,int age){

this.id = id;

this.name = name;

this.age = age;

}

public boolean equals(Object obj){

if(obj == null){

return false;

}

if(this == obj){

return true;

}

if(obj.getClass() != this.getClass()){

return false;

}

Student student = (Student)obj;

if(!student.getName().equals(getName())){

return false;

}

return true;

}

public int compareTo(Student student) {

return this.age - student.age;

}

/** 省略getter、setter方法 */

}

Student类实现Comparable接口和实现equals方法,其中compareTo是根据age来比对的,equals是根据name来比对的。

public static void main(String[] args){

List list = new ArrayList<>();

list.add(new Student("1", "chenssy1", 24));

list.add(new Student("2", "chenssy1", 26));

Collections.sort(list); //排序

Student student = new Student("2", "chenssy1", 26);

//检索student在list中的位置

int index1 = list.indexOf(student);

int index2 = Collections.binarySearch(list, student);

System.out.println("index1 = " + index1);

System.out.println("index2 = " + index2);

}

按照常规思路来说应该两者index是一致的,因为他们检索的是同一个对象,但是非常遗憾,其运行结果:

index1 = 0

index2 = 1

为什么会产生这样不同的结果呢?这是因为indexOf和binarySearch的实现机制不同,indexOf是基于equals来实现的只要equals返回TRUE就认为已经找到了相同的元素。而binarySearch是基于compareTo方法的,当compareTo返回0 时就认为已经找到了该元素。在我们实现的Student类中我们覆写了compareTo和equals方法,但是我们的compareTo、equals的比较依据不同,一个是基于age、一个是基于name。比较依据不同那么得到的结果很有可能会不同。所以知道了原因,我们就好修改了:将两者之间的比较依据保持一致即可。

对于compareTo和equals两个方法我们可以总结为:compareTo是判断元素在排序中的位置是否相等,equals是判断元素是否相等,既然一个决定排序位置,一个决定相等,所以我们非常有必要确保当排序位置相同时,其equals也应该相等。

细节(4.1):实现了compareTo方法,就有必要实现equals方法,同时还需要确保两个方法同步。

参考文献:编写高质量代码:改善Java程序的151个建议

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值