1,两种接口的展示

下面的程序是两个类各自实现了Comparable接口、Comparator接口

package com.cnblogs.mufasa.Solution;

import java.util.Comparator;

class Solution1 implements Comparable<Solution1>{
int val;
public Solution1(int val){
this.val=val;
} @Override
public int compareTo(Solution1 o) {
return val-o.val;
}
} class Solution2 implements Comparator<Solution2> {
int val;
public Solution2(int val){
this.val=val;
} @Override
public int compare(Solution2 o1, Solution2 o2) {
return o1.val-o2.val;
}
} public class Client{
public static void main(String[] args) {
Solution1 sl1=new Solution1(5);
Solution1 sl2=new Solution1(1);
System.out.println("sl1.compareTo(sl2):"+sl1.compareTo(sl2)); Solution2 sl21=new Solution2(5);
Solution2 sl22=new Solution2(1);
System.out.println("sl21.compare(sl21,sl22):"+sl21.compare(sl21,sl22));
System.out.println("sl21.compare(sl21,sl22):"+sl21.reversed().compare(sl21,sl22));
}
}
/*
sl1.compareTo(sl2):4
sl21.compare(sl21,sl22):4
sl21.compare(sl21,sl22):-4
*/

2,两种接口的比较

  通过上面的展示程序,我们可以发现这两个接口实现起来都很简单,并且实现的逻辑都基本一样。但是差别还是有的!

  上面是我总结的一些各自的相同点与不同点。

3,各自优缺点

  Comparable实现简单、功能纯粹单一;Comparator实现可简单可复杂,可以在进行Collections.sort()以及Arrays.sort()中临时实现这个接口,并且实现方式还花里胡哨的【函数式编程、直接比较等等】

package com.cnblogs.mufasa.Solution2;

import java.util.Arrays;
import java.util.Comparator; public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
} @Override
public int compareTo(Person o) {//先按照姓名的字典序排序,再按照年龄的由小到大排序
String ab=name+o.name;
String ba=o.name+name;
int len=ab.length();
for(int i=0;i<len;i++){
int temp=ab.charAt(i)-'0'-ba.charAt(i);
if(temp<0){
return -1;
}else if(temp>0){
return 1;
}
}
return age-o.age;
} public String getName() {
return name;
} public int getAge() {
return age;
}
} class Client{
public static void main(String[] args) {
Person[] ps=new Person[6];
ps[0]=new Person("Mufasa",22);
ps[1]=new Person("Mufasa",18);
ps[2]=new Person("Wanyu",24);
ps[3]=new Person("Guoyahong",24);
ps[4]=new Person("Guoyahong",26);
ps[5]=new Person("Admin",26); for(Person p:ps){
System.out.print(p.getName()+","+p.getAge()+"\t");
}
System.out.println(); // Arrays.sort(ps);//使用自带的Comparable可以直接实现
// Arrays.sort(ps,Comparator.comparing(Person::getName).thenComparing(Person::getAge));//使用Comparator验证成功
// Arrays.sort(ps,Comparator.comparing(Person::getName).thenComparing(Person::getAge).reversed());//使用Comparator进行反转reversed,整体反转
// Arrays.sort(ps,Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge));//使用Comparator进行反转reversed,部分反转1
Arrays.sort(ps,Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge).reversed());//使用Comparator进行反转reversed,部分反转2 // Arrays.sort(ps,(a,b)->{//利用Comparator接口的简化函数式编程,平时我使用的就是这个简单易用
// String ab=a.getName()+b.getName();
// String ba=b.getName()+a.getName();
// int len=ab.length();
// for(int i=0;i<len;i++){
// int temp=ab.charAt(i)-'0'-ba.charAt(i);
// if(temp<0){
// return -1;
// }else if(temp>0){
// return 1;
// }
// }
// return a.getAge()-b.getAge();
// }); for(Person p:ps){
System.out.print(p.getName()+","+p.getAge()+"\t");
}
System.out.println();
}
}

4,应用领域

  一般情况下,我们默认使用Comparable接口【优先选择】,主要是因为这种比较方法简单易实现,并且功能纯粹;

  如果Comparable实现的比较功能,我们自己不满意想要临时更改,那么花里胡哨的Comparator就闪亮登场了,这个功能多,并且低耦合度,我们可以使用的时候随意进行调整,并且还可以【把多个Comparator链在一起】去实现更加复杂的比较逻辑!

list.sort(Comparator.comparing(Employee::getSalary).thenComparing(Employee::getName));//多个Comparator链接组合成复杂排序-层级排序

5,参考链接

https://www.cnblogs.com/szlbm/p/5504634.html

https://blog.csdn.net/bitcarmanlee/article/details/73381705

Java Comparable与Comparator区别的更多相关文章

  1. Java中Comparable和Comparator区别小结

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

  2. Java Comparable 和 Comparator 接口详解

    本文基于 JDK8 分析 Comparable Comparable 接口位于 java.lang 包下,Comparable 接口下有一个 compareTo 方法,称为自然比较方法.一个类只要实现 ...

  3. Java Comparable和Comparator

    Java中在进行数据排序时,Comparable和Comparator不可缺少会遇得到.普通的String.Integer等类型,已经实现了Comparable接口,而有些时候,我们须要对一些其它不存 ...

  4. 简谈Comparable和Comparator区别

    对于Comparable和Comparator这连个相似的接口,还是做一下比较比较好: Comparable Comparator (1)只包含一个compareTo()方法,此方法可以给两个对象排序 ...

  5. java Comparable 和 Comparator接口区别

    Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”.  即然实现Comparable接口的类支持排序,假设现在存在“实现C ...

  6. Java中Comparable和Comparator区别

    很好的一篇博客:http://blog.csdn.net/jq_ak47/article/details/61203817 http://www.cnblogs.com/cmxwt/p/6215253 ...

  7. java Comparable and Comparator

    1.Comparable简介 此接口对实现它的每个类的对象强加一个总排序.这种排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法.可以通过 Collections.sort(和Ar ...

  8. Comparable与Comparator区别(实现和使用)

    一.Comparable接口 1.Comparable接口是什么? 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 . ...

  9. Comparable与Comparator区别

    两者都是比较接口 void sort(List<Comparable>); Sorts the specified list in ascending natural order. The ...

随机推荐

  1. nrm -- 一键切换npm源

    0. 背景 先描述一下没有nrm时我们是怎样使用npm源的 查看npm源地址,终端中输入 npm config list 可以看到npm源 metrics-registry = "https ...

  2. 回声消除(AEC)原理

    一.前言 因为工作的关系,笔者从2004年开始接触回声消除(Echo Cancellation)技术,而后一直在某大型通讯企业从事与回声消除技术相关的工作,对回声消除这个看似神秘.高端和难以理解的技术 ...

  3. ArcPy地理处理工具案例教程—批量添加栅格数据

    ArcPy地理处理工具案例教程-批量添加栅格数据 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 关键字: Arcpy,python,地理处理工 ...

  4. shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计

    shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...

  5. shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句

    shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句条件语句 if(条件表达式) 动作1 else if(条件表达式) 动作2 else 动 ...

  6. php报错syntax error, unexpected T_GOTO, expecting T_STRING,报错文件与行数指向以下代码,是什么原因?

    本机php版本是5.3.8,Apache/2.2.21public function goto($url, $msg=NULL) {if ($msg) {$this->jsAlert($msg) ...

  7. ES6深入浅出-3 三个点运算 & 新版字符串-1.函数与对象的语法糖

    主要讲的内容 时间充裕的话就讲,模板字面量 默认参数值 首先讲es6之前,我们是怎么做的.例如我们要写一个求和的函数, 请两个参数的和,但是如果有的人就是穿一个参数呢? 那么b没有传值,b的值是多少呢 ...

  8. 【Redis】Redis Sentinel 哨兵模式搭建

    Redis Sentinel介绍 Redis Sentinel是Redis的官方高可用性解决方案 Redis Sentinel为Redis提供高可用性.实际上,这意味着使用Sentinel可以创建一个 ...

  9. 【Linux】Jenkins以war包运行及开机启动配置(四)

    本例介绍jenkins已war包运行及开机启动配置 环境:Linux环境(CentOS 7.4) 以war包运行 1.下载jenkins.war包 2.启动war包( 默认端口:8080,默认JENK ...

  10. CentOS "libc.so.6: version 'GLIBC_2.14' not found"解决方法,同理'GLIBC_2.15' not found"

    出现"libc.so.6: version 'GLIBC_2.14' not found"问题,是由于glibc版本过低,升级glibc即可. 由于CentOS系统RPM源目前gl ...