当前位置: 首页 > news >正文

java中的排序方法

在 Java 中,排序是一个非常常见的操作。Java 提供了多种排序方法,适用于不同的数据类型和场景。下面我们系统、全面地介绍 Java 中的排序方法,包括:

  • 数组排序
  • 集合排序
  • 自定义排序
  • 并行排序
  • Lambda 表达式排序
  • 稳定性与算法原理

🧱 一、Java 排序的核心方式(4 大类)

类别适用对象主要方法
1. Arrays.sort()数组(基本类型、对象数组)Arrays.sort(arr)
2. Collections.sort()集合(List)Collections.sort(list)
3. List.sort()List 接口自带list.sort(comparator)
4. Stream.sorted()流式处理stream.sorted()

📌 二、详细用法与示例

✅ 1. Arrays.sort() —— 排序数组

(1) 基本类型数组(升序)
int[] arr = {5, 2, 8, 1, 9};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [1, 2, 5, 8, 9]

⚠️ 基本类型(int[], double[], char[] 等)不支持逆序,需手动处理。

(2) 对象数组(如 String[]
String[] names = {"Alice", "Bob", "Charlie"};
Arrays.sort(names); // 按字典序
System.out.println(Arrays.toString(names)); // [Alice, Bob, Charlie]
(3) 自定义排序(使用 Comparator
Integer[] nums = {5, 2, 8, 1, 9};
// 降序排列
Arrays.sort(nums, Comparator.reverseOrder());
System.out.println(Arrays.toString(nums)); // [9, 8, 5, 2, 1]// 按绝对值排序
Integer[] arr = {-3, -1, 4, 2};
Arrays.sort(arr, (a, b) -> Integer.compare(Math.abs(a), Math.abs(b)));
System.out.println(Arrays.toString(arr)); // [-1, 2, -3, 4]

✅ 2. Collections.sort() —— 排序 List 集合

List<String> list = Arrays.asList("Charlie", "Alice", "Bob");
Collections.sort(list);
System.out.println(list); // [Alice, Bob, Charlie]// 降序
Collections.sort(list, Comparator.reverseOrder());

✅ 适用于 ArrayList, LinkedList 等实现了 List 接口的集合。


✅ 3. List.sort() —— List 自带排序(推荐)

List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
people.add(new Person("Charlie", 20));// 按年龄排序
people.sort(Comparator.comparing(Person::getAge));
System.out.println(people);

✅ 这是 Java 8+ 推荐方式,更简洁。


✅ 4. Stream.sorted() —— 流式排序(函数式编程)

List<String> sorted = list.stream().sorted() // 升序.collect(Collectors.toList());// 按长度排序
List<String> byLength = list.stream().sorted(Comparator.comparing(String::length)).collect(Collectors.toList());// 逆序
List<String> reversed = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());

✅ 优势:链式调用、延迟执行、可组合过滤等操作。


🎯 三、自定义对象排序(实现 ComparableComparator

方式 1:实现 Comparable 接口(自然排序)

public class Person implements Comparable<Person> {private String name;private int age;@Overridepublic int compareTo(Person other) {return Integer.compare(this.age, other.age); // 按年龄排序}
}
List<Person> list = ...;
Collections.sort(list); // 自动按 age 排序

方式 2:使用 Comparator(更灵活)

// 按姓名排序
list.sort(Comparator.comparing(Person::getName));// 多字段排序:先按年龄,再按姓名
list.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));

🔁 四、逆序(降序)排序方法

方法示例
Comparator.reverseOrder()list.sort(Comparator.reverseOrder())
Collections.reverseOrder()Collections.sort(list, Collections.reverseOrder())
reversed()Comparator.comparing(Person::getAge).reversed()
list.sort(Comparator.comparing(Person::getAge).reversed()); // 年龄从大到小

⚡ 五、并行排序(Java 8+)

适用于大数据量排序,利用多核 CPU。

int[] largeArray = new int[1_000_000];
// 填充数据...// 并行排序(基本类型)
Arrays.parallelSort(largeArray);// 并行排序(对象)
Person[] persons = ...;
Arrays.parallelSort(persons, Comparator.comparing(Person::getAge));

✅ 原理:使用 并行归并排序(Parallel Merge Sort)


🧮 六、排序算法原理(Java 内部实现)

Java 的排序算法根据数据类型和大小自动选择:

类型算法特点
int[], long[] 等基本类型双轴快排(Dual-Pivot Quicksort)快,但不稳定
Integer[], String[] 等对象数组TimSort(归并 + 插入)稳定,适合部分有序数据
小数组(< 47)插入排序简单高效
极大数据并行归并排序利用多线程

TimSort 是 Python 和 Java 集合排序的默认算法,稳定且性能优秀。


📊 七、稳定性对比

方法是否稳定
Arrays.sort(Object[])✅ 是(TimSort)
Arrays.sort(int[])❌ 否(双轴快排)
Collections.sort()✅ 是
List.sort()✅ 是
Stream.sorted()✅ 是

稳定排序:相等元素的相对位置不变。


🚫 八、注意事项

  1. null 值处理

    • Comparator.nullsFirst() / nullsLast()
    list.sort(Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo)));
    
  2. 不可变集合排序

    • stream().sorted().collect() 生成新集合
  3. 性能建议

    • 小数据量:sort()
    • 大数据量:parallelSort()
    • 频繁排序:考虑使用 TreeSetPriorityQueue

✅ 九、总结:Java 排序方法一览表

方法适用对象是否稳定是否支持 Lambda推荐场景
Arrays.sort(arr)数组基本类型 ❌,对象 ✅通用数组排序
Collections.sort(list)List集合排序(传统)
list.sort(comp)List推荐,Java 8+
stream.sorted()Stream流式处理、链式调用
Arrays.parallelSort()大数组对象 ✅大数据并行排序

🎁 十、一句话口诀

小数组用 sort,大数组用 parallelSort
集合用 list.sort(),流式用 stream.sorted()
自定义排序靠 Comparator,多字段用 thenComparing


http://www.dtcms.com/a/362071.html

相关文章:

  • 视频监控芯片:智慧安防的“隐形大脑”
  • Product Hunt 每日热榜 | 2025-09-01
  • 10.《基础知识探秘:DHCP地址分配员》
  • 【51单片机三路抢答器定时器1工作1外部中断1】2022-11-24
  • [Windows] 图片裁剪 v1.0 按比例裁剪图片部分另存
  • nginx关于root
  • 【大模型记忆-Mem0详解-3】安装和设置
  • 35.序列(中)
  • 在Linux系统中安装Jenkins(保姆级别)
  • Linux 下 MySQL 数据库定时备份脚本与 Crontab 配置
  • 在本地使用 Docker 创建一个易受攻击的云环境
  • Day23 机器学习流水线(管道/pipeline)
  • Windows系统安装Git详细教程
  • c# winform 拼图游戏
  • 随机获取集合里面的某一条数据
  • 利用Mybatis自定义排序规则实现复杂排序
  • UBUNTU之Onvif开源服务器onvif_srvd:1、编译
  • Java synchronized 关键字详解
  • JAVA后端开发——forEach 与方法引用(::)详解
  • 剧想智读项目展示
  • 针对redis中的热数据该怎么处理
  • Qt 项目文件(.pro)中添加 UI 文件相关命令
  • 【系规伴学】云资源规划核心知识点解析
  • vcruntime140.dll丢失解决办法
  • pandas自学笔记16 pandas可视化
  • 继承体系中的隐藏机制解析(继承中的作用域)
  • Unity图集 SpriteAltas 打包探究
  • [界面通过zmq请求调用指定动态库函数(三)]将zmq请求集成二次开发接口
  • Android 文件下载 FileDownloader
  • TypeScript交叉类型、重复属性、类型断言和as const详解