文档章节

Java源码系列(1):Comparable和Comparator的区别

 学习Java的小姐姐
发布于 2018/09/19 21:54
字数 993
阅读 27
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

在讲Comparable和Comparator区别之前,先补充一个知识点。
先看代码:
Person类

 1public class Person<T> {
2  private T id;
3
4  public T getId() {
5    return id;
6  }
7
8  public void setId(T id) {
9    this.id = id;
10  }
11}

test类

 1public class test {
2  public  static void main(String[] args){
3    //id为String类型
4    Person<String> person1=new Person<>();
5    person1.setId("00001");
6    System.out.println(person1.getId());
7    //id为Integer类型
8    Person<Integer> person2=new Person<>();
9    //person2.setId("1");//错误,因为id为Integer类型
10    person2.setId(1);
11    System.out.println(person2.getId());
12  }
13}

结果如下:

解释:此处的T为泛型,是Java1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这样的好处是所有的强制类型转化都是自动和隐式的,提高了代码的重用率,比如Map<K,V> 就是使用这样的方式。


先讲Comparable:
comparable:是一个接口,只有一个方法。

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

后讲Comparator:

1public interface Comparator<T{
2    int compare(T o1, T o2);
3    boolean equals(Object obj);
4}


例子1:(对Long类型的List排序)

 1public class test {
2  public  static void main(String[] args){
3    List<Long> list=new ArrayList<>();
4    list.add(1L);
5    list.add(12L);
6    list.add(3L);
7    list.add(4L);
8    //1.第一种方法:使用工具类排序
9    Collections.sort(list);
10    //2.第二种方法:使用Comparator
11    Collections.sort(listnew Comparator<Long>() {
12      @Override
13      public int compare(Long o1, Long o2) {
14        return o1.compareTo(o2);
15      }
16    });
17    System.out.println(list);
18  }
19}

解释:第一种方法是使用Collections工具类,Long类里面有Comparable接口的方法compareTo,第二种方法是使用Comparator中compare方法。下图是Long类的compareTo方法,已经给我们封装好了。

例子2:(对自定义对象数组的排序)

1.使用Comparable:
Person类

 1public class Person implements Comparable<Person{
2  private String name;
3  private int age;
4
5  public Person(String name, int age) {
6    this.name = name;
7    this.age = age;
8  }
9
10  public String getName() {
11    return name;
12  }
13
14  public void setName(String name) {
15    this.name = name;
16  }
17
18  public int getAge() {
19    return age;
20  }
21
22  public void setAge(int age) {
23    this.age = age;
24  }
25
26  @Override
27  public int compareTo(Person o) {
28    return this.age - o.getAge();
29  }
30}

test类

 1public class Test {
2  public static void main(String[] args){
3    List<Person> list=new ArrayList<>();
4    list.add(new Person("易烊千玺",20));
5    list.add(new Person("刘浩然",21));
6    list.add(new Person("吴磊",18));
7    Collections.sort(list);
8    for(int i=0;i<list.size();i++){
9      System.out.println(list.get(i).getName()+","+list.get(i).getAge());
10    }
11  }
12}

结果:


2.使用Comparator

 1public class Person{
2  private String name;
3  private int age;
4
5  public Person(String name, int age) {
6    this.name = name;
7    this.age = age;
8  }
9
10  public String getName() {
11    return name;
12  }
13
14  public void setName(String name) {
15    this.name = name;
16  }
17
18  public int getAge() {
19    return age;
20  }
21
22  public void setAge(int age) {
23    this.age = age;
24  }
25}

test类

 1public class Test {
2  public static void main(String[] args){
3    List<Person> list=new ArrayList<>();
4    list.add(new Person("易烊千玺",20));
5    list.add(new Person("刘浩然",21));
6    list.add(new Person("吴磊",18));
7    Collections.sort(listnew Comparator<Person>() {
8      @Override
9      public int compare(Person o1, Person o2) {
10        return o1.getAge()-o2.getAge();
11      }
12    });
13    for(int i=0;i<list.size();i++){
14      System.out.println(list.get(i).getName()+","+list.get(i).getAge());
15    }
16  }
17}

结果:

综上所述,得出结论。

两者相同点:Comparable和Comparator都是用来实现集合元素的比较和排序的。

两者不同点:

Comparable是集合内部定义的方法,位于java.lang包下,是一个对象本身就已经支持比较需要实现的接口,比如String,Integer自己就实现了Comparable接口,那么他们就可以按照定义好的实现排序功能,也就是自然排序。

Comparator是集合外部实现的排序,位于java.util包下,是一个专用的比较器,不需要改变自身。


本文分享自微信公众号 - 学习Java的小姐姐(huangtest01)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

粉丝 0
博文 70
码字总数 94565
作品 0
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
8
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1
5分钟 maven3 快速入门指南

前提条件 你首先需要了解如何在电脑上安装软件。如果你不知道如何做到这一点,请询问你办公室,学校里的人,或花钱找人来解释这个给你。 不建议给Maven的服务邮箱来发邮件寻求支持。 安装Mav...

fanl1982
2014/01/23
1.2W
7

没有更多内容

加载失败,请刷新页面

加载更多

抖音批量发布软件,批量运营200+自媒体账号

抖音批量发布软件,批量运营200+自媒体账号,现在短视频平台大家也可以看的到,流量很大,很多人开通了商品橱窗,在上面进行带货,赚钱也很简单,尤其是抖音这个平台,男女老少都在玩,里面也...

osc_emgrwx5d
37分钟前
9
0
基于MES系统的企业信息化系统的集成

引言 随着网络和科技的发展,互联网技术和电子信息技术已经逐渐融入了我们生活工作的各个环节。在企业中,企业信息化程度的高低也直接影响到企业的运营。企业要想得到快速长远的发展,就要利...

osc_7owgvpdx
39分钟前
28
0
dockerfile源码编译安装nginx、php和harbor

安装docker 环境:基于CentOS Linux release 7.6.1810 注意:以下所有操作基于root用户 #centos7# step 1: 安装必要的一些系统工具yum install -y yum-utils device-mapper-persistent-da...

osc_otuqqtuq
40分钟前
13
0
条形码识别器Dynamsoft Barcode Reader v7.5全新上线!

Dynamsoft Barcode Readerv7.5带来了一些新的参数配置,例如中心定位条形码、二值化模式等。让我们来看看新功能中的一些亮点。 更新 添加了对QR Code Model 1(QR Code规范的旧版本)的支持。...

roffey
40分钟前
6
0
TCP端口的十一种连接状态

TCP端口的十一种连接状态∶ CLOSED∶端口默认是关闭状态。 
LISTEN∶服务器程序开始监听一个端口,就是LISTEN状态。 
 

SYN_RCVD∶三次握手的第二次握手后的端口状态,是收到了客户端发...

程序员面试吧
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部