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的世界里,精心研究学习新鲜事物的感觉,即便再小再细再微不足道的东西,也让我乐此不疲,同时我也更愿意将我所会的东西分享出来供大家学习以及方便自己日后回顾.好了,闲话不多说 ...
随机推荐
- 新财报再次巨亏 HTC还能活到2017吗?
HTC还能活到2017吗?" title="新财报再次巨亏 HTC还能活到2017吗?"> 当下智能手机行业虽然竞争惨烈,但也称得上是精彩纷呈:性能.外形不断进化, ...
- CentOS7搭建FTP Server
本文主要记录CentOS下FTP Server的安装和配置流程. 安装vsftpd yum install -y vsftpd 启动vsftpd service vsftpd start 运行下面的命 ...
- LeetCode~移除元素(简单)
移除元素(简单) 1. 题目描述 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使 ...
- Android入门(创建、编译、运行、打包、安装)
一.创建Android项目 1.选择Emtpy Activity=>Next 2.配置项目 输入Name(名称) Package.name(包名) Save location(保存位置) Lan ...
- Spark基础全解析
我的个人博客:https://www.luozhiyun.com/ 为什么需要Spark? MapReduce的缺陷 第一,MapReduce模型的抽象层次低,大量的底层逻辑都需要开发者手工完成. 第 ...
- Python——用turtle模块画海龟的第一步
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- HttpClientFactory的套路,你知多少?
背景 ASP.NET Core 在 2.1 之后推出了具有弹性 HTTP 请求能力的 HttpClient 工厂类 HttpClientFactory. 替换的初衷还是简单摆一下: ① using(v ...
- html建立大众点评页面遇到的问题
大众点评所用知识 HTML.CSS.bootstrap3 遇到的问题 因图片无法对齐 源码:抛弃div改用img后成功对齐 解决后成功对齐 源码: 导航栏文本无法右对齐. 我想到的方法是: div{ ...
- 纯CSS实现元素垂直水平居中-非固定宽度
这里不讨论行内元素的居中!! 盒子垂直居中+水平居中的需求时经常遇到的,看到的较多实现逻辑是固定content-box的宽度,通过让margin-left和margin-top等于宽或高的负一半来实现 ...
- WinPcap vs Npcap
1.两者都一直有人在维护,而并不是nmap官网介绍的已经停止维护了,https://nmap.org/npcap/vs-winpcap.html 2.Wireshark默认使用WinPcap,他无法抓 ...