列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()

列表类型

一.Collections.sort()

Collections.sort()用于List类型的排序,其提供了两个重载方法:

1.sort(List<T> list)

(1)List指定泛型时只能指定引用数据类型,也就是说无法用于基本数据类型的排序。

(2)如果T是String类型,则会按字典顺序进行升序排序。

(3)对于八大包装类,除了Boolean以外均实现了Comparable接口,默认按数字顺序进行升序排序。

(4)如果T是自定义数据类型,则前提是T必须实现Comparable接口,并重写其compareTo()方法,才能使用该方法进行排序。

2.sort(List<T> list , Comparator<? super T> c)

(1)这种方式会对传入的List对象,按照比较器c的规则进行排序

(2)如果类T实现过Comparable接口,则比较器Comparator的比较规则会优先于Comparable的比较规则

可以看到原本Student类实现Comparable接口,在compareTo()方法中要求按age进行升序排序,但是执行Collections.sort()方法时会优先按传入的比较器进行排序,而比较器中的compare()方法要求按age进行降序排序。

(3)上述写法也可以通过lambda表达式简写

二.list.sort()

list.sort()只有一种写法,没有重载方法

1.sort(Comparator<? super E> c)

(1)这个sort()方法是属于List类的一个普通方法,通过对象调用

(2)需注意的是:使用该方法必须传入一个Comparator对象指定排序规则。列表指定的泛型对象实现的Comparable接口在该方法的调用中是无效的,只能按Comparator指定的排序规则排序。

(3)上述Collections.sort()的例子中,studentList的排序可以替换成:

(4)同样可以用lambda表达式简写

三.list.stream().sorted()

list.stream().sorted()存在两个重载方法

1.list.stream().sorted().collect(Collectors.toList())

(1)使用方法与上述的Collections.sort()相同,sorted()会对List对象进行自然排序

(2)List指定的泛型对象需要实现Comparable接口,排序时会按其compareTo()方法进行排序

(3)上述studenList使用这种方法进行升序排序

2.list.stream().sorted(Comparator<? super E> c).collect(Collectors.toList())

(1)使用方法与上述sort(Comparator<? super E> c)相同

(2)上述studenList使用这种方法进行降序排序(使用lambda表达式简写)

3.注意

(1)sorted()实际是Stream类的一个普通方法,因此需要通过list.stream()先获取到列表的流对象才能调用

(2)**list.stream().sorted()并不会对list对象进行排序,而是会返回一个按排序规则排好的Stream对象,而原list对象不会发生任何改变。**而.collect(Collectors.toList())用于将Stream对象转成List对象。

(3)按照上述说法,若想对list进行排序,则该方法的完整使用方法是:

list = list.stream().sorted().collect(Collectors.toList());

数组类型

一.Arrays.sort()

Arrays.sort()提供了两个重载方法

1.Arrays.sort(T[] a)

(1)若T为基本数据类型,则按照数字顺序进行升序排序

(2)若T为String类型,则按照字典顺序进行升序排序

(3)若T为引用数据类型,则T必须实现Comparable接口并重写其compareTo()方法才能排序

(4)八大包装类除Boolean外都实现了Comparable接口,按数字顺序升序排序

(5)对Student类型数组进行升序排序(上述Student类已经实现了Comparable接口,其compareTo()方法指定按age进行升序排序)

2.Arrays.sort(T[] a, Comparator<? super T> c)

(1)用法与上述使用Comparator进行排序的方式相同

(2)对students数组进行降序排序(使用lambda表达式简写)

总结

1.Collections

(1)sort()

(2)是Collections类的静态方法,通过类调用

(3)需传入排序对象,排序对象就是传入的列表对象

(4)支持Comparable和Comparator两种方式

(5)用于List对象,只支持引用数据类型

2.List

(1)sort()

(2)是List类的普通方法,通过对象调用

(3)无需传入排序对象,排序对象就是调用者本身

(4)只支持Comparator

(5)用于List对象,只支持引用数据类型

3.Stream

(1)sorted()

(2)是Stream类的普通方法,通过对象调用

(3)无需传入排序对象,排序对象不是调用者,而是一个新的对象并以返回值返回

(4)支持Comparable和Comparator两种方式

(5)用于List对象,只支持引用数据类型

4.Arrays

(1)sort()

(2)是Arrays类的静态方法,通过类调用

(3)需传入排序对象,排序对象就是传入的数组对象

(4)支持Comparable和Comparator两种方式

(5)用于数组对象,支持基本数据类型和引用数据类型

相关推荐
QC班长13 分钟前
Maven公司私库配置踩坑点
java·服务器·maven·intellij-idea
Makoto_Kimur16 分钟前
java开发面试-AI Coding速成
java·开发语言
wuqingshun3141591 小时前
说说mybatis的缓存机制
java·缓存·mybatis
空中海1 小时前
Kubernetes 生产实践、可观测性与扩展入门
java·贪心算法·kubernetes
Devin~Y1 小时前
大厂Java面试实录:Spring Boot/Cloud、Kafka、Redis、K8s 与 Spring AI(RAG/Agent)三轮连环问
java·spring boot·redis·mysql·spring cloud·kafka·kubernetes
bLEd RING2 小时前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
小松加哲2 小时前
Spring MVC 核心原理全解析
java·spring·mvc
Ulyanov2 小时前
《PySide6 GUI开发指南:QML核心与实践》 第二篇:QML语法精要——构建声明式UI的基础
java·开发语言·javascript·python·ui·gui·雷达电子对抗系统仿真
码界筑梦坊2 小时前
357-基于Java的大型商场应急预案管理系统
java·开发语言·毕业设计·知识分享
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【31】集成 Studio 模块实现可视化 Agent 调试
java·人工智能·spring