前言

最近复习遇到了这个问题,在此进行一个详细的记录,分享给大家。

两个接口的区别

包区别

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的区别相关推荐

  1. JAVA语言-比较器Comparator(java中Comparable和Comparator的区别)

    文章目录 一.什么是Comparator 二.Java compare方法和compareTo方法 三.java中Comparable和Comparator的区别 Comparator的例子 三.de ...

  2. Java中Comparable和Comparator接口区别分析

    本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...

  3. Java中Comparable与Comparator的区别

    一.概述 Comparable和Comparator都是用来实现集合中元素的比较.排序的. Comparable是在集合内部定义的方法实现的排序,位于java.util下. Comparator是在集 ...

  4. JAVA中Comparable和 Comparator的区别

    Comparable 和 Comparator比较 简介 Comparable 1.1说明 1.2举例 Comparator 1.1说明 1.2举例 相同点: 不同点: 简介 Comparable 和 ...

  5. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  6. 简单介绍Java中Comparable和Comparator

    转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...

  7. Java中Comparable和Comparator实现对象比较

    Java中Comparable和Comparator实现对象比较 目录 一. Comparator 二. Comparable 三.比较 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comp ...

  8. Java中Comparable和Comparator区别小结

    阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Comparable简介 Comparable是排序接口.若 ...

  9. Java中Comparable和Comparator接口的区别

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u010859650/article/details/85009595 Comparable 简介 Comparable 是排序 ...

最新文章

  1. VS code 插件配置手册
  2. 软件配置文件如何读写
  3. 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第七节)
  4. 007_CSS ID选择器
  5. java cucumber_为Java + STANDARD值引入Cucumber
  6. java中domain什么意思_java解析URL中domain、端口和协议的两种方法
  7. 看懂 IPv6+,这篇就够了
  8. 【演讲实录】RWP团队谈SQL优化
  9. javascript热身运动-了解最基本的知识
  10. 国家市场监管总局:低价倾销、大数据杀熟等价格违法行为将被罚
  11. 【leetcode刷题笔记】Sqrt(x)
  12. php 白名单,php实现ip白名单黑名单功能
  13. pickle.dump()把大量数据写入文件发生MemoryError解决方法
  14. 电子健康行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  15. html中span标签w3c,HTML col 标签
  16. Servlet→对象监听器、事件监听器、Session钝化活化、@WebListener标注、过滤器概念原理生命周期、过滤器链、@WebFilter标注、定时器Timer、cancel()、purge
  17. 介绍一下mysql数据库_一、简单介绍下 MySQL数据库
  18. laravel 集合从父中移除_在 Laravel 7 中优雅使用 UUID 教程
  19. 现代通信原理7.1:模拟角度调制的基本概念
  20. git撤销单个文件的修改_程序员都要掌握的 Git 使用技巧【实践】

热门文章

  1. php怎么添加框架,PHPWind 给默认的风格添加大框架
  2. java域对象_javaWeb域对象
  3. 教你在微信头像上加皇冠,很漂亮!
  4. 这款可视化工具,Java 调优起来真的 so easy啊
  5. ​赠书:面向对象的两大迷思,再给你们解答一次
  6. linux修改权限重启恢复,Linux错误执行:chmod 777 .*或chown -R * 的补救方法
  7. matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)
  8. 【mysql】mysql的数据库主从(一主一从)
  9. Spring事务--笔记
  10. python 有序字典 OrderedDict