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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
//重写接口方法,o为要比较的对象
@Override
public int compareTo(Person o) {
//大于要比较的对象就返回1
if(this.salary>o.getSalary()){
return 1;
}
//小于则返回-1
else if(this.salary<o.getSalary()){
return -1;
}
//相等则返回0
return 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;
}
@Override
public String toString() {
return "Staff{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
创建接口的实现类
import java.util.Comparator;
/**
* 单独写的比较器,实现Compartor接口
*/
public class StaffComparator implements Comparator<Staff> {
//不一定要自然排序即升序,可以反过来写成降序
@Override
public 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中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- 你能说说Java中Comparable和Comparator的区别吗
之前面试中被问到这个问题,当时不屑(会)回答,下来特意查了查,整理如下. Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较.排序. 下面 ...
- Java 中 Comparable 和 Comparator 比较
Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...
- Java 中 Comparable 和 Comparator 比较(转)
转自http://www.cnblogs.com/skywang12345/p/3324788.html 本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示 ...
- Java中Comparable和Comparator区别小结
一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...
- java中Comparable和Comparator两种比较器的区别
Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...
- 夯实Java基础(十五)——Java中Comparable和Comparator
1.前言 对于Java中的对象,我们只能使用基本运算符==.!=来判断一下地址是否相等,不能使用>.<来比较大小.但是在实际的开发中,我们需要对对象进行排序,也就是比较大小,那么应该如何实 ...
- Java中Comparable和Comparator你知多少?
前言: 我喜欢这种遨游在Java的世界里,精心研究学习新鲜事物的感觉,即便再小再细再微不足道的东西,也让我乐此不疲,同时我也更愿意将我所会的东西分享出来供大家学习以及方便自己日后回顾.好了,闲话不多说 ...
随机推荐
- lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问
lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问,如果关闭防火墙虚拟IP就可以访问网站了,这个问题肯定是防火墙在作怪. 经过这两的不懈奋斗和大家的帮助 ...
- Redis-输入输出缓冲区
一.client list id:客户端连接的唯一标识,这个id是随着Redis的连接自增的,重启Redis后会重置为0addr:客户端连接的ip和端口fd:socket的文件描述符,与lsof命令结 ...
- 当鼠标hover的时候,使用tip将overflow:hidden隐藏的文字显示完全
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 初识Arduino
Arduino是一款便捷灵活.方便上手的开源电子原型平台.包含硬件(各种型号的Arduino板)和软件(Arduino IDE).由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Ba ...
- Pycharm+PyQt5开发环境配置
一.安装Python开发环境 python官网下载地址:https://www.python.org/downloads/ 注:千万不要使用最新测试版,很有可能第三方库不支持 笔者目前使用的版本是3. ...
- 7-44 jmu-python-区间数之和 (10 分)
输入一个区间,计算里面能被3整除或被5整除的数和. 输入格式: 每行输入一个数据,代表区间左界和右界.区间包含左界和右界.数据必须是整数. 输出格式: 满足条件数和. 输入样例: 2 10 输出样例: ...
- 第一篇:注册中心Eureka
1.什么是Eureka,有什么用? Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是spri ...
- 停下来,回头看 ——记2020BUAA软工第一次作业-热身!
description: 'Mar 1st, 2020 - Mar 3rd, 2020' 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 第一次作 ...
- Unity C# Scoket Thread
关于 Scoket和Thread 也没什么要说的,网上有很多资料.但是需要注意的是 Scoket和Thread 都需要创建和杀死.不然一定会造成程序假死.好了上代码 服务器: using System ...
- ant tree 展开key的集合
这次有个功能 ant的tree 展开 点击子节点 新增节点之后 数据能够照常展开 有几种方法 我能想到的 因为ant 有个expanded 只要设置为true就能展开了,但是这边有个陷阱,就是仅仅设置 ...