• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > 详解java中保持compareTo和equals同步

详解java中保持compareTo和equals同步

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了compareto和equals,java compareto,java compareto方法,java中compareto,java compareto用法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

详解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方法 */
}

</div>

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);
  }

</div>

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

index1 = 0

index2 = 1
</div>

为什么会产生这样不同的结果呢?

这是因为indexOf和binarySearch的实现机制不同。

indexOf是基于equals来实现的只要equals返回TRUE就认为已经找到了相同的元素。

而binarySearch是基于compareTo方法的,当compareTo返回0 时就认为已经找到了该元素。

在我们实现的Student类中我们覆写了compareTo和equals方法,但是我们的compareTo、equals的比较依据不同,一个是基于age、一个是基于name。比较依据不同那么得到的结果很有可能会不同。

所以知道了原因,我们就好修改了:将两者之间的比较依据保持一致即可。

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

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解java中保持compareTo和equals同步

相关文章

  • 2017-05-28Spring4整合Hibernate5详细步骤
  • 2017-05-28详解 Java 中 equals 和 == 的区别
  • 2017-05-28Java微信公众平台开发(9) 关键字回复以及客服接口实现
  • 2017-05-28SWT(JFace)体验之打开多个Form
  • 2017-05-28SpringBoot JPA 表关联查询实例
  • 2017-05-28Java中反射动态代理接口的详解及实例
  • 2017-08-27Java Spring技术栈构建完整前后台团购网站
  • 2017-05-28JAVA实现简单停车场系统代码
  • 2017-05-28springboot集成spring cache缓存示例代码
  • 2017-05-28Java 多线程有序执行的几种方法总结

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 30分钟入门Java8之默认方法和静态接口方法学习
    • 详解Spring中bean实例化的三种方式
    • Java使用强大的Elastisearch搜索引擎实例代码
    • String类下compareTo()与compare()方法比较
    • Java 创建线程的两个方法详解及实例
    • Java中finalize()详解及用法
    • java 类加载机制和反射详解及实例代码
    • Spring boot实现一个简单的ioc(1)
    • 详解在Spring Boot中使用Mysql和JPA
    • Java验证码图片生成代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有