关于Comparable和Comparator那些事
在实际项目开发过程中,我们经常需要对某个对象或者某个集合中的元素进行排序,常用的两种方式是实现某个接口。常见的可以实现比较功能的接口有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那些事的更多相关文章
- 来吧,一文彻底搞懂Java中的Comparable和Comparator
大家好,我是沉默王二,今天在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:Java 的 Comparable 和 Comparator 是兄弟俩吗?像这类灵魂拷问 ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- 对象比较器:Comparable和Comparator
在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator ①.java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个co ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Comparable和Comparator的区别
Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...
- Java中Comparable和Comparator区别小结
一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...
- Java 中 Comparable 和 Comparator 比较
Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...
- Comparable与Comparator
转载 Comparable与Comparator的区别 (转载) Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部 ...
- Java中的TreeMap、Comparable、Comparator
我们知道HashMap的存储位置是按照key这个对象的hashCode来存放的,而TreeMap则是不是按照hashCode来存放,他是按照实现的Comparable接口的compareTo这个方法来 ...
随机推荐
- php面试笔记(5)-php基础知识-自定义函数及内部函数考点
本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而函数相关的考点 ...
- css浮动(float)详解
一.什么是浮动? 浮动,顾名思义,就是漂浮的意思.指的是一个元素脱离文档流,悬浮在父元素之上的现象. 二.如何产生浮动? 给元素本身添加float属性 float值: left 元素向左浮动. rig ...
- 以stm32f407为例,学习cortex-m4通用寄存器的用法
测试代码如下: int add(int a, int b, int c, int d, int e, int f) { return a+b+c+d+e+f; } int main(void) { i ...
- junit测试的介绍和应用
目录 1.junit测试简介 2.运行环境 3.测试过程 1.junit测试简介 JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent ...
- [WPF 学习] 3.用户控件库使用资源字典的困惑
项目需要(或者前后端分离的需要),前端我使用了用户控件库,由后端用代码加载和控制. 然而用户控件库没法指定资源字典,于是在用户控件的xaml文件里面手工添加了资源字典 <UserControl. ...
- 学习笔记——python(继承)
学习笔记(Python继承) 有几种叫法(父类-子类.基类-派生类)先拿代码演示一下: class father: def work(self): print("work>>&g ...
- Cesium案例解析(三)——Camera相机
目录 1. 概述 2. 实例 2.1. Camera.html 2.2. Camera.js 2.2.1. 飞行至某一点 2.2.2. 飞行至某区域 2.2.3. 两地之间飞行 2.2.4. 设置视图 ...
- Linux kernel简介
内核体系设计分:单内核,微内核 windows是微内核设计. Linux是单内核设计,但充分借鉴了为微内核体系的优点,为内核引入了模块化机制. 内核的组成部分 kernel:内核核心,一般为bz压缩的 ...
- P1613 跑路【倍增】【最短路】
题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟 ...
- C++实现一个简单的双栈队列
双栈队列的原理是用两个栈结构模拟一个队列, 一个栈A模拟队尾, 入队的元素全部压入此栈, 另一个栈B模拟队首, 出队时将栈A的元素弹入栈B, 将栈B的栈顶元素弹出 此结构类似汉诺塔, 非常经典, 这里 ...