Java中Comparable和Comparator的区别
前言
最近复习遇到了这个问题,在此进行一个详细的记录,分享给大家。
两个接口的区别
包区别
Comparable接口是在java.lang下。
Comparator接口是在java.util下。
使用区别
如果在定义类时,就实现了Comparable接口,直接在里面重写compareTo()方法,如果没实现,后面在业务开发中需要有比较排序的功能,就再单独写一个类实现Comparator接口,在里面重写compare()方法,然后这个类需要作为参数传入到工具类Collections.sort和Arrays.sort方法中。
使用场景
主要用于集合排序Collections.sort和Arrays.sort。
使用Comparable接口的实现方案
在定义类的时候,就实现这个接口,将排序规则定义好。
/*** 实体类,实现Comparable接口*/
public class Person implements Comparable<Person>{//属性private String name;private int age;private int salary;//get和set方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}//构造方法public Person(String name, int age, int salary) {this.name = name;this.age = age;this.salary = salary;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}';}//重写接口方法,o为要比较的对象@Overridepublic int compareTo(Person o) {//大于要比较的对象就返回1if(this.salary>o.getSalary()){return 1;}//小于则返回-1else if(this.salary<o.getSalary()){return -1;}//相等则返回0return 0;}
}
测试方法:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class TestComparable {public static void main(String[] args) {//测试Comparable接口Person p1=new Person("clyang",18,4000);Person p2=new Person("messi",30,8000);Person p3=new Person("ronald",32,9000);Person p4=new Person("herry",19,7600);Person p5=new Person("roben",35,7900);//添加到集合List<Person> list=new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);list.add(p4);list.add(p5);System.out.println("-----------------排序前-----------------");for (Person person : list) {System.out.println(person);}//排序一般使用Collections.sort方法,或者使用Arrays.sort方法,按照比较的元素进行自然排序,即从小到大Collections.sort(list);System.out.println("-----------------排序后-----------------");for (Person person : list) {System.out.println(person);}}
}
使用Comparator
这个接口主要用于实体创建的时候,没有实现接口,但又需要比较的情况。
/*** 实体类,不实现Comparable接口,使用单独的Comparator接口*/
public class Staff {//属性private String name;private int age;private int salary;public Staff(String name, int age, int salary) {this.name = name;this.age = age;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}@Overridepublic String toString() {return "Staff{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}';}
}
创建接口的实现类
import java.util.Comparator;/*** 单独写的比较器,实现Compartor接口*/
public class StaffComparator implements Comparator<Staff> {//不一定要自然排序即升序,可以反过来写成降序@Overridepublic int compare(Staff o1, Staff o2) {//降序/*if(o1.getSalary()>o2.getSalary()){return -1;}if(o1.getSalary()<o2.getSalary()){return 1;}return 0;*///升序/*if(o1.getSalary()>o2.getSalary()){return 1;}if(o1.getSalary()<o2.getSalary()){return -1;}return 0;*///先按照年龄倒序排,如果年龄相等比较工资if(o1.getAge()>o2.getAge()){return -1;}if(o1.getAge()<o2.getAge()){return 1;}//能到这里说明年龄相等,继续比较工资if(o1.getSalary()>o2.getSalary()){return 1;}if(o1.getSalary()<o2.getSalary()){return -1;}return 0;}
}
测试方法:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class TestComparator {public static void main(String[] args) {//测试Comparator接口Staff p1=new Staff("clyang",18,4000);Staff p2=new Staff("messi",30,8000);Staff p3=new Staff("ronald",32,9000);Staff p4=new Staff("herry",18,7600);Staff p5=new Staff("roben",35,7900);//添加到集合List<Staff> list=new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);list.add(p4);list.add(p5);System.out.println("-----------------排序前-----------------");for (Staff staff : list) {System.out.println(staff);}//排序,需要使用自定义比较类Comparator myComparator=new StaffComparator();Collections.sort(list,myComparator);System.out.println("-----------------排序后-----------------");for (Staff staff : list) {System.out.println(staff);}}
}
总结
两种接口的最主要区别还是一个对象自己实现和后期实现的区别。
Java中Comparable和Comparator的区别相关推荐
- JAVA语言-比较器Comparator(java中Comparable和Comparator的区别)
文章目录 一.什么是Comparator 二.Java compare方法和compareTo方法 三.java中Comparable和Comparator的区别 Comparator的例子 三.de ...
- Java中Comparable和Comparator接口区别分析
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...
- Java中Comparable与Comparator的区别
一.概述 Comparable和Comparator都是用来实现集合中元素的比较.排序的. Comparable是在集合内部定义的方法实现的排序,位于java.util下. Comparator是在集 ...
- JAVA中Comparable和 Comparator的区别
Comparable 和 Comparator比较 简介 Comparable 1.1说明 1.2举例 Comparator 1.1说明 1.2举例 相同点: 不同点: 简介 Comparable 和 ...
- java comparator相等_详解Java中Comparable和Comparator接口的区别
详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...
- 简单介绍Java中Comparable和Comparator
转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...
- Java中Comparable和Comparator实现对象比较
Java中Comparable和Comparator实现对象比较 目录 一. Comparator 二. Comparable 三.比较 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comp ...
- Java中Comparable和Comparator区别小结
阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Comparable简介 Comparable是排序接口.若 ...
- Java中Comparable和Comparator接口的区别
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u010859650/article/details/85009595 Comparable 简介 Comparable 是排序 ...
最新文章
- VS code 插件配置手册
- 软件配置文件如何读写
- 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第七节)
- 007_CSS ID选择器
- java cucumber_为Java + STANDARD值引入Cucumber
- java中domain什么意思_java解析URL中domain、端口和协议的两种方法
- 看懂 IPv6+,这篇就够了
- 【演讲实录】RWP团队谈SQL优化
- javascript热身运动-了解最基本的知识
- 国家市场监管总局:低价倾销、大数据杀熟等价格违法行为将被罚
- 【leetcode刷题笔记】Sqrt(x)
- php 白名单,php实现ip白名单黑名单功能
- pickle.dump()把大量数据写入文件发生MemoryError解决方法
- 电子健康行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- html中span标签w3c,HTML col 标签
- Servlet→对象监听器、事件监听器、Session钝化活化、@WebListener标注、过滤器概念原理生命周期、过滤器链、@WebFilter标注、定时器Timer、cancel()、purge
- 介绍一下mysql数据库_一、简单介绍下 MySQL数据库
- laravel 集合从父中移除_在 Laravel 7 中优雅使用 UUID 教程
- 现代通信原理7.1:模拟角度调制的基本概念
- git撤销单个文件的修改_程序员都要掌握的 Git 使用技巧【实践】
热门文章
- php怎么添加框架,PHPWind 给默认的风格添加大框架
- java域对象_javaWeb域对象
- 教你在微信头像上加皇冠,很漂亮!
- 这款可视化工具,Java 调优起来真的 so easy啊
- ​赠书:面向对象的两大迷思,再给你们解答一次
- linux修改权限重启恢复,Linux错误执行:chmod 777 .*或chown -R * 的补救方法
- matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)
- 【mysql】mysql的数据库主从(一主一从)
- Spring事务--笔记
- python 有序字典 OrderedDict