Compator和Comparable都可以用于集合或者数组的排序。

  但Comparable是在类内定义比较方法,主要用于对象内部的比较方式,对象需要实现Comparable接口

  而Compator则是在类外定义比较方法,用作自定义的比较方式

总结:Comparator是比较器,实现Comparable的对象自身可以直接比较 

一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。

像Arrays和Collections中的排序方法,当不指定Comparator时使用的就是默认排序方式,也就是使用Comparable。指定Comparator时就是使用提供的比较器。

  sort(Object[]) 所有的对象都必须实现Comparable接口,它用来确定对象之间的大小关系

  sort(Object[], Comparator) 对象不必实现Comparable接口,由Comparator比较器来确定对象之间的大小关系。

Comparable接口位于java.lang包下:

public interface Comparable<T>{public int compareTo(T o);//唯一一个方法
}

Comparator接口位于java.util包下:

public interface Comparator<T>{int compare(T o1, T o2);......//还有其他方法
}

自定义一个类分别演示下两个接口的用法:

一、实现Comparable接口:

1.

public class User implements Comparable{
private String id;
private String name;
private int age;public User(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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;
}
@Override
public int compareTo(Object o) {
return this.age - ((User) o).getAge();
}
}import java.util.Arrays;public class SampleComparable {
public static void main(String[] args) {
User[] users = new User[] { new User("a","name1", 30), new User("b","name2", 20),new User("c","name3", 25) };  Arrays.sort(users);  for (int i = 0; i < users.length; i++) {  User user = users[i];  System.out.println(user.getId() + " " + user.getAge());  }
}
}

2.

public class Test {public static void main(String[] args){List<Person> list = new ArrayList<Person>();list.add(new Person(20));list.add(new Person(19));list.add(new Person(21));for(Person p : list)System.out.println(p.getAge());Collections.sort(list);for(Person p : list)System.out.println(p.getAge());}
}class Person implements Comparable<Person>{private int age;public Person(int age){this.age = age;}public int compareTo(Person anotherPerson){if(age == anotherPerson.age)return 0;else if(age < anotherPerson.age)return -1;elsereturn 1;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

二、实现Comparator接口:

1.

import java.util.Arrays;
import java.util.Comparator;public class SampleCompartor {
public static void main(String[] args) {
String[] array = new String[] { "BCD", "ABC", "Cdb" };
Arrays.sort(array, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
}

2.

public class Test {public static void main(String[] args){List<Person> list = new ArrayList<Person>();list.add(new Person(20));list.add(new Person(19));list.add(new Person(21));for(Person p : list)System.out.println(p.getAge());Collections.sort(list, new PersonComparator());for(Person p : list)System.out.println(p.getAge());}
}class Person{private int age;public Person(int age){this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}class PersonComparator implements Comparator<Person>{public int compare(Person p1, Person p2){if(p1.getAge() == p2.getAge())return 0;else if(p1.getAge() < p2.getAge())return -1;elsereturn 1;}
}

两者的选择: 
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要在类内部进行方法的定义,如遇到复杂的比较逻辑,代码看起来会比较混乱冗余, 用Comparator 的好处是不需要将比较方法定义在类内,代码的分离性较好。

转载于:https://www.cnblogs.com/pluto-yang/p/9330009.html

Comparable与Comparator相关推荐

  1. Java 中 Comparable 和 Comparator 比较

    为什么80%的码农都做不了架构师?>>>    本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comp ...

  2. Java 解惑:Comparable 和 Comparator 的区别

    读完本文你将了解到: Comparable 自然排序 Comparator 定制排序 总结 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢? ...

  3. 对象比较:Comparable 和 Comparator

    java中我们如何给对象排序?这就必须借助Comparator 或 Comparable.有了他们就意味着你可用实现对象之间的比较.也就可用做到排序了. Comparable Comparable 也 ...

  4. Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

    1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1) ...

  5. java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序

    本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...

  6. Java中Comparable和Comparator区别小结

    阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Comparable简介 Comparable是排序接口.若 ...

  7. comparable和comparator比较

      今天在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparat ...

  8. Java中Comparable与Comparator的区别

    一.概述 Comparable和Comparator都是用来实现集合中元素的比较.排序的. Comparable是在集合内部定义的方法实现的排序,位于java.util下. Comparator是在集 ...

  9. Comparable与Comparator浅析

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

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

    本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...

最新文章

  1. BERT 预训练模型及文本分类(情感分类)
  2. Vivado中IP核的xci, xcix, .dcp文件的区别
  3. linux系统预定义变量有哪些,Shell预定义变量用法详解
  4. 四大基本反应类型的关系_初中化学7大反应类型总结,收藏
  5. 基于事件驱动架构构建微服务第13部分:使用来自Apache KAFKA的事件并将投影流传输到ElasticSearch...
  6. 我是怎么用机器学习技术找到女票的
  7. 开源微服务编排框架:Netflix Conductor
  8. swagger的使用方式
  9. java判断long 大于0_JAVA的一道习题:找出五个大于Long.MAX_VALUE的素数
  10. 电机与拖动基础第四版_伺服电机控制
  11. cad计算机画图标准,CAD画图某些常用尺寸及作图习惯
  12. [项目管理]-第九章:项目管理计划
  13. 蚁人2:黄蜂女现身全集百度云资源
  14. 港股交易系统搭建介绍 — 港股LV2行情
  15. 微博相册下载助手v7.2 微博图片批量下载神器
  16. PS图层模式详细讲解
  17. 解决PHP报错No input file specified
  18. VScode修改html代码后,浏览器页面更新不及时
  19. Django项目骨架与常见配置修改
  20. Cocos技术派 | TS版属性面板定义高级用法

热门文章

  1. SpringCloud——消息驱动
  2. QCon全球软件开发大会:推动创新,实现技术落地
  3. 给马云的一幅画——阿里国际站用户体验设计案例精选
  4. Spark 和 Hadoop MapReduce 对比
  5. PostgreSQL逻辑优化——整体架构
  6. java 象限分析_用四种象限分析你(未来的人生走向)
  7. JZ7-斐波那契数列
  8. Harmony OS — RoundProgressBar圆形进度条
  9. 《Android群英传:神兵利器》— Android 书籍
  10. L1-037 A除以B (10 分)—团体程序设计天梯赛