全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解java中保持compareTo和equals同步

详解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  # compareTo和equals同步  # compareTo与equals  # Java中compareTo方法使用小结  # Java中BigDecimal的equals方法和compareTo方法的区别详析  # Java中BigDecimal比较大小的3种方法(​​compareTo()、​​equals()​  # Java compareTo用法详解  # JavaSE中compare、compareTo的区别  # Java 基础:string中的compareTo方法  # java compare compareTo方法区别详解  # java compareTo和compare方法比较详解  # java使用compareTo实现一个类的对象之间比较大小操作  # Java中替代equals  # compareTo和toString的方法  # Java中比较运算符compareTo()、equals()与==的区别及应用总结  # JAVA中compareTo方法的使用小结  # 是基于  # 来实现  # 比对  # 的是  # 找到了  # 就有  # 就好  # 很有  # 我们可以  # 希望能  # 写了  # 还需要  # 有必要  # 重写  # 时就  # 因为他们  # 谢谢大家  # 这是因为  # 是否存在  # 类中 


相关文章: 如何通过二级域名建站提升品牌影响力?  高端云建站费用究竟需要多少预算?  如何通过虚拟主机快速搭建个人网站?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  Swift中swift中的switch 语句  广东企业建站网站优化与SEO营销核心策略指南  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  高性价比服务器租赁——企业级配置与24小时运维服务  制作电商网页,电商供应链怎么做?  如何快速搭建虚拟主机网站?新手必看指南  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何在局域网内绑定自建网站域名?  c++ stringstream用法详解_c++字符串与数字转换利器  如何做网站制作流程,*游戏网站怎么搭建?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  建站之星代理如何优化在线客服效率?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  西安大型网站制作公司,西安招聘网站最好的是哪个?  上海网站制作开发公司,上海买房比较好的网站有哪些?  如何用花生壳三步快速搭建专属网站?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  在线教育网站制作平台,山西立德教育官网?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  如何在IIS中新建站点并配置端口与物理路径?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  建站与域名管理如何高效结合?  教程网站设计制作软件,怎么创建自己的一个网站?  建站之星安装需要哪些步骤及注意事项?  制作网站的模板软件,网站怎么建设?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何用搬瓦工VPS快速搭建个人网站?  如何使用Golang安装API文档生成工具_快速生成接口文档  如何选择PHP开源工具快速搭建网站?  网站制作新手教程,新手建设一个网站需要注意些什么?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  seo网站制作优化,网站SEO优化步骤有哪些?  python的本地网站制作,如何创建本地站点?  如何快速选择适合个人网站的云服务器配置?  建站168自助建站系统:快速模板定制与SEO优化指南  网站制作需要会哪些技术,建立一个网站要花费多少?  电商网站制作公司有哪些,1688网是什么意思?  C++如何编写函数模板?(泛型编程入门)  如何用PHP工具快速搭建高效网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。