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

Java中的sort()排序详解

  排序是编程中最常见的操作之一,无论是对数组、集合,还是对自定义对象,都会遇到排序需求。Java 提供了多种排序方法,涵盖基础数组排序、集合排序,以及自定义排序规则。本文将系统介绍 Java 中 sort() 的多种用法,深入讲解排序原理、代码示例与实战技巧。

首先需要明确的是:sort 方法定义如下(Java 8 中 List 接口):

void sort(Comparator<? super E> c);

其中 Comparator 是一个函数式接口,它只有一个抽象方法:

int compare(T o1, T o2);

 其中对于compare

  • T:是要比较的对象类型(例如 String, Integer, Person 等)

  • o1o2:是要进行比较的两个对象

  • 返回值是一个整数,用于表示它们的大小关系:

  • 小于0:升序,大于0:降序

返回值含义
< 0(负数)o1 小于 o2(o1 排在前面)
= 0(零)o1 等于 o2(不影响顺序)
> 0(正数)o1 大于 o2(o2 排在前面)

一、数组排序:Arrays.sort()

Java 的 Arrays.sort() 是对数组进行排序的基础方法,适用于基本数据类型数组和对象数组。

1. 基本数据类型数组排序

对整型、浮点型、字符型数组进行排序,只需调用:

int[] nums = {5, 3, 8, 1, 4};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));  // 输出:[1, 3, 4, 5, 8]

该方法内部对原始类型数组采用的是基于双枢轴快速排序(Dual-Pivot Quicksort),平均时间复杂度为 O(n log n),性能优良。

2. 对象数组排序

对于对象数组,如 String[],默认按自然顺序(字典序)排序:

String[] fruits = {"Banana", "Apple", "Orange"};
Arrays.sort(fruits);
System.out.println(Arrays.toString(fruits)); // 输出:[Apple, Banana, Orange]

3. 自定义排序规则

如果需要基于某种业务逻辑排序,比如字符串长度,可以传入 Comparator

Arrays.sort(fruits, (a, b) -> a.length() - b.length());
System.out.println(Arrays.toString(fruits)); // 输出:[Apple, Banana, Orange]

 这里使用了 Lambda 表达式,等价于实现 Comparator<String> 的匿名类。

二、集合排序:Collections.sort()List.sort()

1. Collections.sort() 简介

Java 集合框架中的 Collections.sort() 方法用于对 List 进行排序。其底层实现调用了 List 自身的 sort() 方法。

List<Integer> list = Arrays.asList(5, 2, 7, 1);
Collections.sort(list);
System.out.println(list);  // 输出:[1, 2, 5, 7]

2. 自定义排序规则

同样支持传入 Comparator 来实现复杂排序逻辑:

Collections.sort(list, (a, b) -> b - a);
System.out.println(list);  // 输出:[7, 5, 2, 1]

3. Java 8+ 推荐使用 List.sort()

Java 8 引入了 List 接口的 sort() 方法,支持直接用 Lambda 表达式,代码更简洁:

list.sort(Integer::compareTo);  // 升序
list.sort(Comparator.reverseOrder());  // 降序

http://www.xdnf.cn/news/1229851.html

相关文章:

  • 涉水救援机器人cad【12张】三维图+设计书明说
  • linux编译基础知识-头文件标准路径
  • 轻量级鼠标右键增强工具 MousePlus
  • eSIM技术深度解析:从物理芯片到数字革命
  • Python从入门到精通——第五章 列表与元组
  • 机器学习【五】decision_making tree
  • 深入解析Java Stream Sink接口
  • JVM学习日记(十四)Day14——性能监控与调优(一)
  • 小迪23年-22~27——php简单回顾(2)
  • IMAP电子邮件归档系统Mail-Archiver
  • rabbitmq消息队列详述
  • 【Android】使用 Intent 传递对象的两种序列化方式
  • 深度学习-模型初始化与模型构造
  • 高性能MCP服务器架构设计:并发、缓存与监控
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情数据可视化分析-热词情感趋势树形图
  • 【机器学习】非线性分类算法详解(下):决策树(最佳分裂特征选择的艺术)与支持向量机(最大间隔和核技巧)
  • 在 AKS 中运行 Azure DevOps 私有代理-1
  • Linux性能监控与调优全攻略
  • React ahooks——副作用类hooks之useThrottleFn
  • React ahooks——副作用类hooks之useDebounceFn
  • Shell【脚本 02】离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
  • 堆----1.数组中的第K个最大元素
  • 通过filezilla在局域网下实现高速传输数据
  • 2025-08 安卓开发面试拷打记录(面试题)
  • 【龙泽科技】汽车故障诊断仿真教学软件【风光580】
  • Vue 详情模块 4
  • Python科研数据可视化技术
  • 知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例
  • 在 AKS 中运行 Azure DevOps 自托管代理-2
  • 线程池的实现