Java集合细节(四):保持compareTo和equals同步
2023-09-11 14:19:12 时间
在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也应该相等。
细节(4.1):实现了compareTo方法,就有必要实现equals方法,同时还需要确保两个方法同步。
Java IO基础(同步阻塞IO) Java IO是一套Java 用来读写数据(输入和输出)的API,大部分程序都需要处理一些输入,并由输入产生一些输出(PS: 输入和输出是相对CPU而言的,input 就是从外面到CPU,output就是从CPU到外面,CPU是主人公)。java.io 包下有大约80多个类,大概可以分成四组:
Java NIO、BIO、 AIO 与 同步、阻塞、非阻塞、异步IO 简析 我相信大部分人看到这些名词,都是一头雾水的,如果你去搜索引擎搜索,那么恭喜你,你又会被各种文章中的高大上的名词搞得云里雾里。那么,我们应该怎么理清这么名词之间的关系呢? 所谓 同步/异步/阻塞/非阻塞 IO ,是指操作系统中的对 IO 处理的不同方法,而 Java 对这些不同操作方法做了一些包装,由此有了 BIO / NIO / AIO 几种操作接口。 我不想复制一些高大上的概念,只是想尽量好好说话,说清楚他们之间的关系。 有 A、B、C、D 四个线程可以生产文件,假设他们的返回的文件是一样的,对应我们的服务端 有 E、F、G、H 四个线程在随机时间向服务端上传一个文本,并且要求
Java中实现异步转同步的几种方式 Android常见的异步转同步的方式是通过Callback + Handler的方式来完成,常见的例子是在子线程请求网络,成功后调用Callback,然后通过Handler发送消息给主线程,让子线程更新UI。当然了,实际开发还有好多方式可以实现这种操作。
Java多线程(二)、线程的生命周期、线程的同步、Synchronized的使用方法、同步代码块、同步方法、同步机制中的锁、同步的范围、Lock(锁、不会释放锁的操作、单例设计模式之懒汉式(线程安全) Java多线程(二)、线程的生命周期、线程的同步、Synchronized的使用方法、同步代码块、同步方法、同步机制中的锁、同步的范围、Lock(锁、不会释放锁的操作、单例设计模式之懒汉式(线程安全)
相关文章
- 《Java并发编程实战》第五章 同步容器类 读书笔记
- java.lang.Class<T> -- 反射机制
- C03-Java同步实践加强班第11周上机任务
- Ubuntu安装java的几种方式以及多个JAVA版本的切换
- Java详解,java后端应届生面试题
- 【JAVA UI】HarmonyOS如何跳转三方的地图导航
- Java IDEA中设置导入import java.xx.*和设置导入具体的import java.xx.yy;
- 字符编码介绍及java中的应用
- Java中线程的同步问题
- Java Map各遍历方式的性能比较
- 「Java 数据结构」:环形链表和约瑟夫问题。
- Java之throw和throws的区别及java中的异常处理
- 『Java练习生的自我修养』java-se进阶⁵ • 常用IO流
- Java操作Mongodb 保存/读取java对象到/从mongodb
- Java中的动态代理模式
- JAVA学习:成员内部类基本概念及用法
- Java高手速成│编写你第一个数据库程序
- 【JAVA】同步监视器、同步块和同步监视方法
- JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)
- 百钱百鸡 (C语言,java同步)
- 解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。