详解java中保持compareTo和equals同步

作者:lqh 时间:2023-07-20 12:20:53 

详解java中保持compareTo和equals同步

摘要 : 介绍重写equlas()和comparable接口,两者进行不相同的判断。从而使两者的对应的list.indexOf()与 Collections.binarySearch()得到的不一样。

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


public class Student implements Comparable<Student>{
 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<Student> 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也应该相等。

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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

标签:java,compareTo,equals
0
投稿

猜你喜欢

  • Android中Service与Activity之间通信的几种方式

    2023-10-11 15:40:16
  • Android数字华容道小游戏开发

    2023-10-06 22:31:35
  • GC调优实战之过早提升Premature Promotion

    2023-10-22 10:07:55
  • C# 向Word中设置/更改文本方向的方法(两种)

    2023-01-12 21:37:33
  • Java实现软件运行时启动信息窗口的方法

    2023-01-04 06:21:55
  • 微信js-sdk+JAVA实现“分享到朋友圈”和“发送给朋友”功能详解

    2021-10-20 23:13:51
  • Android调用系统默认浏览器访问的方法

    2022-04-02 12:14:52
  • C#实现加密的几种方法介绍

    2022-12-12 22:38:00
  • Idea自动生成Entity实现过程详解

    2022-06-03 12:18:24
  • Java设计模式之抽象工厂模式实例详解

    2023-11-29 04:04:57
  • Android Application的使用全面解析

    2023-08-26 04:23:49
  • 基于TCP异步Socket模型的介绍

    2022-08-05 23:43:25
  • C#中Razor模板引擎简单使用

    2022-01-21 10:04:13
  • c#项目将dll打包到exe中的步骤

    2021-06-21 14:44:25
  • SpringBoot实现埋点监控

    2022-11-27 06:32:07
  • SpringMvc MultipartFile实现图片文件上传示例

    2022-07-30 16:40:45
  • Java 使用 HttpClient 发送 GET请求和 POST请求

    2023-07-23 07:56:13
  • 简单说明Java的Struts框架中merge标签的使用方法

    2023-09-17 00:32:26
  • 初识MyBatis及基本配置和执行

    2021-11-12 05:53:40
  • Java实现任务超时处理方法

    2023-01-09 14:46:45
  • asp之家 软件编程 m.aspxhome.com