Comparable:

  是集合内部的方法实现的排序,只有一个方法

public interface Comparable<T> {
public int compareTo(T o);
}

对于String和一些基本数据类型,默认实现了Comparable 接口,实现了compareTo方法,可以直接使用。

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value; int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
} public final class Integer extends Number implements Comparable<Integer> {
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
}

使用场景:

  同一个类的两个对象相互比较,类内部的比较

  可以进行排序,但是一定要实现Comparable,否则出现异常

  Collections.sort()和Arrays.sort()内部都有应用

使用样例:

@Slf4j
@Data
@AllArgsConstructor
public class TestUnit implements Comparable<TestUnit>{ private String name;
private Integer age; @Override
public int compareTo(TestUnit o) {
return this.age.compareTo(o.age);
} public static void main(String[] args) {
List<TestUnit> list = new ArrayList<TestUnit>();
list.add(new TestUnit("a",2));
list.add(new TestUnit("b",1));
list.add(new TestUnit("c",3));
System.out.println(list);
Collections.sort(list);
System.out.println(list);
     TestUnit unit = new TestUnit("a", 1);
     TestUnit unit1 = new TestUnit("b", 2);
     System.out.println(unit.compareTo(unit1));
} }

结果:

[TestUnit(name=a, age=2), TestUnit(name=b, age=1), TestUnit(name=c, age=3)]
[TestUnit(name=b, age=1), TestUnit(name=a, age=2), TestUnit(name=c, age=3)]
-1

Comparator:

  是集合外部的方法实现的排序,多个方法

public interface Comparator<T> {
int compare(T o1, T o2); public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));
}
}

使用场景:

  Comparator接口代码更加灵活,可以定义某个类的多个比较器,以满足不用的需求,而不改变对象自身,而用一个策略对象来改变对象的比较

行为(策略模式)。

使用样例:

@Slf4j
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestUnit implements Comparator<TestUnit> { private String name;
private Integer age; public static void main(String[] args) {
List<TestUnit> list = new ArrayList<TestUnit>();
list.add(new TestUnit("a",2));
list.add(new TestUnit("b",1));
list.add(new TestUnit("c",3));
System.out.println(list);
Collections.sort(list, new TestUnit());
System.out.println(list); TestUnit unit = new TestUnit("a", 1);
TestUnit unit1 = new TestUnit("b", 2);
System.out.println(unit.compare(unit, unit1));;
} @Override
public int compare(TestUnit o1, TestUnit o2) {
return o1.age - o2.age;
}
}

结果:

[TestUnit(name=a, age=2), TestUnit(name=b, age=1), TestUnit(name=c, age=3)]
[TestUnit(name=b, age=1), TestUnit(name=a, age=2), TestUnit(name=c, age=3)]
-1

注意事项:

  无论是Comparable还是Comparator实现类在重写compareTo、compare方法时,一般要求compare(o1,o2))==0的逻辑结果要和o1.equals(o2)

保持一致。

总结:

(1)如果比较的方法只用在一个类中,则该类实现Comparable接口就可以

(2)如果比较的方法在很多类中需要用到,就自己写个类实现Comparator接口,实现松耦合

(3)在用Collections类的sort方法排序时,若不指定Comparator,那就以自然顺序排序(自然顺序就是实现Comparable接口设定的排序方式)

参考:https://mp.weixin.qq.com/s/GBJf5eHxhoUwlpm0BB1jpA

Java集合(一)--Comparable和Comparator的更多相关文章

  1. Java基础系列-Comparable和Comparator

    原创文章,转载请标注出处:<Java基础系列-Comparable和Comparator> 一.概述         Java中的排序是由Comparable和Comparator这两个接 ...

  2. Java基础之Comparable与Comparator

    Java基础之Comparable与Comparator 一.前言: Java中实现对对象的排序一般情况下主要有以下两种实现方式(万物皆对象嘛): 对象所在的类实现Comparable 接口 定义比较 ...

  3. Java学习之Comparable与Comparator的区别

    Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序 ...

  4. java比较排序Comparable和Comparator

    1       比较排序Comparable和Comparator 1.1      接口作用说明 Comparable和Comparator都是用来实现对象的比较.排序,对比时需要实现Compara ...

  5. java 中的 Comparable 和 Comparator 与 Iterable 和 Iterator

    Comparable 和 Comparator Comparable 和 Comparator 是两个关系不大的类,其分别侧重于不同的方面. 其中,接口 Comparable<T> 强行对 ...

  6. 【软件构造】(转)Java中的comparable和comparator

    为了方便阅读和复习,转载至此,原地址:温布利往事的博客 阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Co ...

  7. 集合排序Comparable和Comparator有什么区别?

    Comparable和Comparator兄弟俩长得是真像.但是,需要注意下,使用中它们还是有不少区别的.下面,就一探究竟吧. 一.Comparator 做过集合排序的童鞋应该知道,可以使用Colle ...

  8. Java的比较器Comparable与Comparator

    在Java中有两个比较器:Comparable.Comparator 对于Integer.Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序 ...

  9. 来吧,一文彻底搞懂Java中的Comparable和Comparator

    大家好,我是沉默王二,今天在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:Java 的 Comparable 和 Comparator 是兄弟俩吗?像这类灵魂拷问 ...

随机推荐

  1. NYOJ 496 [巡回赛-拓扑排序]

    链接:click here 题意: 巡回赛 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 世界拳击协会(WBA)是历史最悠久的世界性拳击组织,孕育了众多的世界冠军, ...

  2. Vim i和a差别

    i是当前位置插入 a是当前文字的后面插入

  3. hdu 4990 Reading comprehension(等比数列法)

    题目链接:pid=4990" style="color:rgb(255,153,0); text-decoration:none; font-family:Arial; line- ...

  4. 学习Flash Builder编程的准备工作

    1. 下载教科书,Essential ActionScript 3.0或者Programming ActionScript 3.0.这将是你的很好的老师.英语不灵的买一本中文版本. 2. 安装Flas ...

  5. 1章 SpringBoot介绍

    新建一个SpringBoot版的Hello World.

  6. Eclipse出现Class Not Found异常时可以参考我所知道的一个方案

    如过你出现Class Not Found异常,可以参考以下这个解决方案 打开Properties for projectName面板-->Deploment Assembly--:查看有没有缺失 ...

  7. P3402 【模板】可持久化并查集

    传送门 //minamoto #include<bits/stdc++.h> using namespace std; #define getc() (p1==p2&&(p ...

  8. Django day 36 支付宝支付,微信推送

    一:支付宝支付, 二:微信推送

  9. 微服务下,使用ELK做日志收集及分析

    一.使用背景 目前项目中,采用的是微服务框架,对于日志,采用的是logback的配置,每个微服务的日志,都是通过File的方式存储在部署的机器上,但是由于日志比较分散,想要检查各个微服务是否有报错信息 ...

  10. RandomAccessFile使用场景及总结

    大家在学到Java中IO流的时候学到了各种流,对文件的各种操作.但是唯独可能对RandomAccessFile对象不会去过多的研究,那么这个到底有什么用呢? RandomAccessFile的唯一父类 ...