前言

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

两个接口的区别

包区别

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的区别的更多相关文章

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

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  2. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  3. 你能说说Java中Comparable和Comparator的区别吗

    之前面试中被问到这个问题,当时不屑(会)回答,下来特意查了查,整理如下. Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较.排序. 下面 ...

  4. Java 中 Comparable 和 Comparator 比较

    Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...

  5. Java 中 Comparable 和 Comparator 比较(转)

    转自http://www.cnblogs.com/skywang12345/p/3324788.html 本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示 ...

  6. Java中Comparable和Comparator区别小结

    一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...

  7. java中Comparable和Comparator两种比较器的区别

    Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...

  8. 夯实Java基础(十五)——Java中Comparable和Comparator

    1.前言 对于Java中的对象,我们只能使用基本运算符==.!=来判断一下地址是否相等,不能使用>.<来比较大小.但是在实际的开发中,我们需要对对象进行排序,也就是比较大小,那么应该如何实 ...

  9. Java中Comparable和Comparator你知多少?

    前言: 我喜欢这种遨游在Java的世界里,精心研究学习新鲜事物的感觉,即便再小再细再微不足道的东西,也让我乐此不疲,同时我也更愿意将我所会的东西分享出来供大家学习以及方便自己日后回顾.好了,闲话不多说 ...

随机推荐

  1. 解决appium升级后不支持使用name定位的问题

    前言 之前一直用的appium1.4版本,最近升级到了1.6突然发现之前的脚本好多都跑失败了,一看报错: selenium.common.exceptions.InvalidSelectorExcep ...

  2. Gnome Ubuntu16安装Nvidia显卡396驱动,CUDA9.2以及cudnn9.2

    深度学习环境配置,安装Nvidia显卡驱动,CUDA以及cudnn OS:ubuntu 16.04;driver: nvidia 396;CUDA: 9.2cudnn: 9.2 卸载原有Nvidia驱 ...

  3. js中的基本类型和引用类型

    基本数据类型:按值访问,可操作保存在变量中的实际的值.基本类型值指的是简单的数据段. 基本数据类型有这六种:undefined.null.string.number.boolean.symbol(es ...

  4. 微软亚洲研究院开源图数据查询语言LIKQ

    ​ 近日,微软亚洲研究院通过GitHub 平台开源图数据查询语言LIKQ (Language-Integrated Knowledge Query).LIKQ是基于分布式大规模图数据处理引擎Graph ...

  5. Zookeeper的使用场景和集群配置

    Zookeeper的介绍 ZK在分布式系统的应用 Zookeeper搭建 集群角色介绍 ZK的常用命令 一.Zookeeper的介绍 官方:ZooKeeper是一个分布式的,开放源码的分布式应用程序协 ...

  6. 一文看懂js中元素的客户区大小(clientWidth,clientHeight)

    元素的客户区 元素的客户区大小,指的是元素内容及其内边距所占据的空间大小. 相关属性如下: 1. clientWidth:元素内容区宽度+元素左右内边距 2. clientHeight:元素内容区高度 ...

  7. AJAX 的 Ajax返回数据之前的loading等待效果(gif效果等)

    首先,我们通过ajax请求,向后台传递参数,然后后台经过一系列的运算之后向前台返还数据,我希望在等待数据成功返还之前可以展示一个loading.gif图 不废话,在页面上执行点击事件(<a sc ...

  8. 老式车载导航如何支持大于4G的SD卡

    这个知识点以后会越来越没什么用,因为这类导航慢慢就会消失.记录这个,就是提醒自己如何防止以为很懂而被骗. 随着导航地图越来越大,4G的SD卡很快就不够用了,但是很不幸车载导航款式太老了,不支持大于4G ...

  9. Layabox enabled 脚本禁用 坑

    从unity入坑到Layabox,真的是一路踩坑啊,今天这个坑叫做 脚本禁用 enabled 问题一: 首先看官方文档 https://ldc2.layabox.com/doc/?nav=zh-ts- ...

  10. python打包py为exe程序:PyInstaller

    打包库:PyInstaller python程序编写过程中的脚本文件为py格式的文件,当我们想将编写好的程序移植到其他机器上给其他人使用时,如果目标机器没有安装python环境,py文件将无法运行,而 ...