![](https://img.kancloud.cn/2f/45/2f459861d963c59dddd56d7466da4381_643x611.png)
[TOC]
# 1. 排序方式
对于有序的集合来说,排序方式有如下几种。
**1. 自然排序**
集合提供的默认排序方式,原理是存储到集合中的元素实现了 Comparable 接口,通过实现接口中的`compareTo`方法进行排序。
```java
// 如Integer就实现了Comparable接口,并实现了compareTo方法
public final class Integer extends Number implements Comparable<Integer> {
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
}
```
<br/>
**2. 插入顺序**
按插入顺序进行排序,如 ArrayList。
<br/>
**3. 调用`Collections.sort`排序**
```java
// 根据其元素的natural ordering对指定的列表进行排序。
static <T extends Comparable<? super T>> void sort(List<T> list)
// 根据指定的比较器引起的顺序对指定的列表进行排序。
static <T> void sort(List<T> list, Comparator<? super T> c)
```
>[warning]注意:`Collections.sort`方法是一个改变器
<br/>
**4. 自定义排序**
我们重写默认的排序规则,实现我们想要的排序规则。
<br/>
# 2. 自定义排序
案例代码:https://gitee.com/flymini/codes02/tree/master/collection_/com-learn-collection01
****
自定义排序有下面几种方法来实现。
**1. `void sort(List<T> list)`**
(1)元素实现接口 Comparable。
```java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Comparable<Student> {
private String name;
private int age;
@Override
public int compareTo(Student o) {
//根据年龄进行排序,这种写法是升序排序
return this.age - o.age;
//return o.age-this.age; 这个写法是降序排序
}
}
```
(2)调用方法`void sort(List<T> list)`进行排序。
```java
@Test
public void testSort() {
Student zhangsan = new Student("zhangsan", 21);
Student lisi = new Student("lisi", 22);
Student wangwu = new Student("wangwu", 20);
List<Student> students = new ArrayList<>();
students.add(zhangsan);
students.add(lisi);
students.add(wangwu);
//在ArrayList中排序是根据插入顺序进行排序的,此时定制排序还没起作用
System.out.println(students);
//[Student(name=zhangsan, age=21), Student(name=lisi, age=22), Student(name=wangwu, age=20)]
//调用sort方法后,定制排序就起作用了
Collections.sort(students);
System.out.println(students);
//[Student(name=wangwu, age=20), Student(name=zhangsan, age=21), Student(name=lisi, age=22)]
}
```
<br/>
**2. `void sort(List<T> list, Comparator<? super T> c)`**
```java
@Test
public void testSort() {
List<Integer> list = new ArrayList<>();
list.add(200);
list.add(100);
list.add(300);
//使用默认排序
System.out.println(list);
//[200, 100, 300]
//使用比较器排序
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//这是升序排序
return o1 - o2;
//return o2-o1; 这是降序排序
}
});
System.out.println(list);
//[100, 200, 300]
}
```
<br/>
**3. Comparable和Comparator的使用场景**
(1)对于可以被继承的类,我们可以使用 Comparable,或者 Comparator 进行定制排序。
(2)对于不可以被继承的类,那只能用 Comparator 进行定制排序。如 Integer 就不能被继承,所以我们无法继承 Integer,从而实现 Comparable 接口来定制排序。
```java
//Integer无法被继承
class CustomInteger extends Integer implements Comparable<CustomInteger> {
```
- 网络通信
- 网络协议
- 端口和套接字
- TCP网络程序
- UDP网络程序
- 多线程聊天室
- 多线程
- 线程相关概念
- 线程实现方式
- 中断线程
- 线程生命周期
- 线程优先级
- 优先级规则
- 案例演示
- 线程同步机制
- 线程同步机制
- synchronized关键字
- ReentrantLock类
- Condition类
- 监视器概念
- volatile关键字
- final变量
- 死锁
- 线程局部变量
- 读/写锁
- 原子类
- 阻塞队列
- 工作规则
- 案例演示
- 常用阻塞队列
- 线程安全集合
- 高效的映射/集/队列
- 并发集视图
- 写数组的拷贝
- Arrays类的并行数组算法
- 同步包装器
- Callable与Future
- 执行器
- 线程池
- 预定执行
- 控制任务组
- Fork-Join框架
- 同步器
- 同步器
- 信号量
- CountDownLatch类
- CyclicBarrier类
- Exchanger类
- SynchronousQueue类
- 线程与Swing
- Swing与线程问题
- 两个原则
- Swing工作线程
- 单一线程规则
- 文件IO
- File类
- 文件输入输出
- ZIP压缩文件
- 集合
- 集合框架
- 集合接口
- 集合实现类
- 线程安全集合
- 集合算法
- 迭代器
- 集合排序
- JDBC
- JDBC是什么
- JDBC-ODBC桥
- JDBC驱动程序类型
- JDBC常用类与接口
- 数据库操作
- 连接数据库
- 增/删/改/查/预处理
- 事务
- 批处理
- commons-dbutils工具
- 安全问题
- Jedis
- 使用Jedis操作Redis数据库
- JSON转换
- 使用连接池
- 案例
- 单例破坏
- 单例定义
- 单例实现方式
- 懒汉式实现单例
- 饿汉式实现单例
- 单例破坏
- 类的单例破坏
- 枚举的单例破坏
- 克隆
- 克隆是什么
- 浅克隆
- 深克隆
- 注解
- 注解是什么
- 三大注解
- 内置注解
- 元注解
- 自定义注解
- NIO
- 相关概念
- BIO/NIO/AIO
- 多线程编程
- 线程同步
- 线程通信
- NIO
- NIO三大核心组件
- NIO网络编程
- NIO文件读写
- AIO
- Java8新特性
- Lambda表达式
- 方法引用
- 函数式接口
- 默认方法
- 什么是默认方法
- 默认方法语法格式
- 多个同名的默认方法问题
- 静态默认方法
- 默认方法实例
- Stream
- Stream是什么
- Stream示例
- Optional容器
- 新的日期时间API
- Base64
- SPI
- SPI是什么
- SPI与API的区别
- 常见场景
- 使用SPI需遵循的约定
- SPI使用步骤