在实际项目开发过程中,我们经常需要对某个对象或者某个集合中的元素进行排序,常用的两种方式是实现某个接口。常见的可以实现比较功能的接口有Comparable接口和 Comparator接口,那么这两个又有什么区别呢?

关于Comparable接口

  关于Comparable接口,其位于 java.lang.Comparable 中,实现这个接口,可以通过重写其 compareTo 方法进行自定义排序,一般用于实体类中,比如针对学生对象,根据其姓名、身高、年龄、地址等进行排序,商品根据名称、库存、价格排序等。下面一段代码中主要是对 学生的姓名、年龄、地址进行排序,当我们重写其 compareTo 方法后,对于一个学生对象的集合,我们可以通过调用 Collections.sort(studentList) 对其进行排序,即可达到想要的效果。

  

 public class Students implements Comparable<Students> {

     private String name;
private int age;
private String address; 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;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("姓名:").append(this.name);
sb.append("年龄:").append(this.age);
sb.append("地址:").append(this.address);
return sb.toString(); } // 重写排序方法,先根据年龄升序,再根据姓名降序,最后根据地址升序
@Override
public int compareTo(Students o) {
int result= 0;
result = this.age - o.getAge();
if (0 == result){
result = o.getName().compareTo(this.getName());
if (0 == result){
result = this.getAddress().compareTo(o.getAddress());
}
}
return result;
} }

关于Comparator接口

  关于Comparator接口,其位于 java.util.Comparator 中,实现这个接口,可以通过重写其 compare 方法进行自定义的排序,比如针对 字符串的 list,根据其长度递减排序;根据Integer 的集合,根据其大小升序(Collections.sort()方法中默认实现的就是升序)。此外,针对数组的排序,还可以调用 Arrays.sort() 进行排序,其默认是根据字典顺序进行排序。

  

import java.util.*;

public class CompareController1 implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
// int length1 = o1.length();
// int length2 = o2.length();
return o2 - o1; //按照降序排列
} public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(23);
list.add(400);
list.add(222);
list.add(34); Collections.sort(list,new CompareController1());
System.out.println(list.toString()); Object[] objects = list.toArray();
// 针对String类型,默认是按照字典表进行排序
// 针对 int 类型,默认是 按照 升序 进行排序
Arrays.sort(objects);
//不能直接打印数组,那样打印出来的是地址,可以使用 foreach
System.out.println(Arrays.toString(objects)); }
}

扩展补充:

关于Collections.sort()和 Arrays.sort()

1) Collections.sort()方法底层实际就是Arrays.sort(),

2) Arrays.sort()的底层分为两种,满足某种条件就调用这个排序 legacyMergeSort,其底层就是归并排序;如果不满足,就是 TimSort

3) TimSort 的底层根据数组的长度进行区分,如果数组的长度小于32,直接使用简单的合并算法,即二分插入排序(binary merge sort);如果长度大于32,就是 合并算法。

关于Comparable和Comparator那些事的更多相关文章

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

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

  2. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  3. 对象比较器:Comparable和Comparator

    在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator ①.java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个co ...

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

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  5. Comparable和Comparator的区别

    Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...

  6. Java中Comparable和Comparator区别小结

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

  7. Java 中 Comparable 和 Comparator 比较

    Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...

  8. Comparable与Comparator

    转载 Comparable与Comparator的区别 (转载) Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部 ...

  9. Java中的TreeMap、Comparable、Comparator

    我们知道HashMap的存储位置是按照key这个对象的hashCode来存放的,而TreeMap则是不是按照hashCode来存放,他是按照实现的Comparable接口的compareTo这个方法来 ...

随机推荐

  1. JVM解毒——JVM与Java体系结构

    你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从下手 新项目上线,对各种JVM参数设置一脸懵逼,直接默认,然后就JJ了 每次面试都要重 ...

  2. 编译原理实验之SLR1文法分析

    ---内容开始--- 这是一份编译原理实验报告,分析表是手动造的,可以作为借鉴. 基于  SLR(1) 分析法的语法制导翻译及中间代码生成程序设计原理与实现1 .理论传授语法制导的基本概念,目标代码结 ...

  3. Apache 容器 Directory Location Files 及htaccess文件

    配置段容器的类型 相关模块 core mod_proxy 相关指令 <Directory> <DirectoryMatch> <Files> <FilesMa ...

  4. Vue中你可能认为是bug的情况原来是这样的

    前言 我们知道Vue框架剧本双向数据绑定功能,在我们使用方便的同时,还有一些细节问题我们并不知道,接下来一起探讨一些吧 双向数据绑定 js变量改变影响页面 页面改变影响js变量 Vue2是如何做到数据 ...

  5. node准备

    === 原生的api === express express  中间件相关的. https://juejin.im/post/5aa345116fb9a028e52d7217 推荐几篇入门的优质博客: ...

  6. [译]Android Studio 3.6 新特性概览

    设计 设计编辑器 设计编辑器(比如布局编辑器和导航编辑器)现在提供了一个拆分视图模式,能够同时查看 UI 界面的 Design 视图和 Code 视图.拆分视图取代并改进了早期的预览窗口,并且可以对每 ...

  7. [WPF 学习] 3.用户控件库使用资源字典的困惑

    项目需要(或者前后端分离的需要),前端我使用了用户控件库,由后端用代码加载和控制. 然而用户控件库没法指定资源字典,于是在用户控件的xaml文件里面手工添加了资源字典 <UserControl. ...

  8. 最新版的EF Core对UWP支持的怎么样

    为啥写这篇帖子呢?其实是因为翻微软的文档中心偶然翻到的,于是就出于好奇就试试了,看看用着怎么样. 以前没注意图片,所以我今天发现的时候,显示EF Core3.1支持standard2.0,于是就想试试 ...

  9. android sdk manager 无法更新,解决连不上dl.google.com的问题

    感谢博主的帮助,入口在这:https://www.jianshu.com/p/8fb367a51b9f?utm_campaign=haruki&utm_content=note&utm ...

  10. Python中的用open打开文件错误,FileNotFoundError: [Errno 2] No such file or directory:

    学习python的文件处理,刚开始打开文件,代码如下 f = open('test_file.txt', 'r', encoding='UTF-8')RES = f.readlines()print( ...