当前位置: 首页 > news >正文

Comparable和Comparator区别

Comparable和Comparator接口都是实现集合中元素的比较、排序的,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。总体来讲,可以把Comparable理解为内部比较器,而Comparator是外部比较器。Comparable需要修改源码,Comparator则不需要!
 

1、Comparable(内部比较器)

  • 实现了Comparable接口的类中需要重写 int compareTo(T o)方法。
  • 实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
public class Person implements Comparable<Person> {String name;int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public Person() {super();}@Overridepublic int compareTo(Person o) {return this.age - o.age; //从小到大排序!}
}

编写测试类,来对person对象进行排序:

       

import java.util.Arrays;public class Test {public static void main(String[] args) {Person p1 = new Person("zhangsan", 20);Person p2 = new Person("lisi", 18);Person p3 = new Person("wangwu", 25);Person[] persons = {p1, p2, p3};System.out.println("排序前");for (Person person : persons) {System.out.println(person.name + ":" + person.age);}//Arrays是数组工具类,Collections是集合工具类Arrays.sort(persons);System.out.println("排序后");for (Person person : persons) {System.out.println(person.name + ":" + person.age);}}}

 2、Comparator(外部比较器)

  • 不改变源码,从新创建一个类,该类实现了Comparator的接口
  • 重写 int compare(T o1, T o2)方法 是“比较o1和o2的大小”。

创建Person类:

public class Person {String name;int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public Person() {super();}
}

来创建person类的比较器PersonComparator类:

import java.util.Comparator;public class PersonComparator implements Comparator<Person>{@Overridepublic int compare(Person o1, Person o2) {return o1.age - o2.age;}}

编写测试类:

import java.util.Arrays;public class Test {public static void main(String[] args) {Person p1 = new Person("zhangsan", 20);Person p2 = new Person("lisi", 18);Person p3 = new Person("wangwu", 25);Person[] persons = {p1, p2, p3};System.out.println("排序前");for (Person person : persons) {System.out.println(person.name + ":" + person.age);}Arrays.sort(persons, new PersonComparator());System.out.println("排序后");for (Person person : persons) {System.out.println(person.name + ":" + person.age);}}
}

3、总结

二者各有优缺点,用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省重复劳动。
 

http://www.lryc.cn/news/133469.html

相关文章:

  • JAVA知识点梳理
  • [SWPUCTF 2022 新生赛]ez_ez_php
  • GraphQL strawberry的使用回顾和体会
  • 08无监督学习——聚类
  • Python使用OpenCV库对彩色图像进行通道分离
  • 前端面试:【CSS】盒模型、选择器、布局、响应式设计、Flexbox 与 Grid
  • 深入浅出通过PHP封装根据商品ID获取抖音商品详情数据方法
  • 排序(七种排序)
  • 【工程优化问题】基于鲸鱼、萤火虫、灰狼优化算法的张力、压缩弹簧设计问题研究(Matlab代码实现)
  • sap ui5刷新页面的方式
  • Java课题笔记~ Fastjson 概述
  • Arduino 入门学习笔记11 读写内置EEPROM
  • 【Nginx】安装make后遇到/bin/sh: 第 0 行:cd: ../pcre-8.38: 没有那个文件或目录
  • 在Windows Server 2008上启用自动文件夹备份
  • 数据结构—线性表的查找
  • EndNote(一)【界面+功能介绍】
  • JWT令牌验证
  • 【微信小程序】下拉刷新功能实现
  • 三角函数与圆,角度和弧度 (草稿,建设中)
  • AIGC 施展“物理魔法”,3D视觉突破“精度极限”
  • redis 哨兵模式
  • java八股文面试[java基础]——String StringBuilder StringBuffer
  • [oneAPI] 基于BERT预训练模型的命名体识别任务
  • SSL证书如何使用?SSL保障通信安全
  • postgresql 的递归查询
  • Go语言进阶:函数、指针、错误处理
  • 最强自动化测试框架Playwright(30)-JS句柄
  • Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 全
  • 【C++ STL之map,set,pair详解】
  • Python LEGB规则解析与应用