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. POJ 1159 Palindrome(字符串变回文:LCS)

    POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...

  2. 在Linux上安装zsh

    简单介绍: 相对于绝大多数linux发行版默认的shell--bash,zsh绝对是一个优秀的替代品.zsh是交互型shell,同一时候它也是一个强大的编程语言,很多bash,ksh,tcsh优秀的地 ...

  3. Mycat(5):聊天消息表数据库按月分表实践,平滑扩展

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/47003577 未经博主同意不得转载. 1,业务需求 比方一个社交软件,比方像腾讯 ...

  4. Guava ---- EventBus事件驱动模型

    在软件开发过程中, 难免有信息的共享或者对象间的协作. 怎样让对象间信息共享高效, 而且耦合性低. 这是一个难题. 而耦合性高将带来编码改动牵一发而动全身的连锁效应. Spring的风靡正是由于攻克了 ...

  5. TableLayout与MigLayout

    最近新接触的两个Layout,另外之前用的GridBagLayoutHelper以及最近听说的Qt for java的QCSS据说也不错, 只是Qt的跨平台需要单独发布,假如使用QT for java ...

  6. 【172】outlook邮箱设置

    参考:outlook 2013设置 参考:Outlook设置hotmail邮箱POP3和SMTP服务器 注意

  7. bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】

    不能用read会TLE!!不能用read会TLE!!不能用read会TLE!! 一开始以为要维护每个点,线段树写了好长(还T了-- 首先dfs一遍,求出点1为集会地点的答案,处理处val[u]为以1为 ...

  8. 10.27night清北刷题班

    /* 枚举每个部分的总和,利用前缀和进行检验. 如果能分成4部分就一定能分成2部分,就筛了一边素数优化.清空数组!!! */ #include<bits/stdc++.h> #define ...

  9. webapp填坑记录

    网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...

  10. (博弈论)51NOD 1072 威佐夫游戏

    有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取.拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出2堆石子的数量, ...