【JAVA】Collections.sort()方法详解

一、简介

Collections.sort() 是 Java 集合框架(Java Collections Framework)中的一个静态方法,用于对列表(List)中的元素进行排序。此方法利用了 Java 的泛型机制,可以很方便地对各种类型的列表进行排序。

  • 源码方法体:
    在这里插入图片描述
  • 参数 list:需要排序的列表。列表中的元素必须实现了 Comparable 接口,以便能够比较它们的大小。

二、使用示例

1、普通使用

假设你有一个 Integer 类型的列表,你可以使用 Collections.sort() 方法对它进行排序:

	import java.util.ArrayList;  import java.util.Collections;  import java.util.List;  public class SortExample {  public static void main(String[] args) {  List<Integer> numbers = new ArrayList<>();  numbers.add(3);  numbers.add(1);  numbers.add(4);  numbers.add(1);  numbers.add(5);  numbers.add(9);  numbers.add(2);  numbers.add(6);  numbers.add(5);  numbers.add(3);  numbers.add(5);  System.out.println("Before sorting:");  for (int number : numbers) {  System.out.print(number + " ");  }  System.out.println();  Collections.sort(numbers);  System.out.println("After sorting:");  for (int number : numbers) {  System.out.print(number + " ");  }  }  }
输出:
	Before sorting:  3 1 4 1 5 9 2 6 5 3 5   After sorting:  1 1 2 3 3 4 5 5 5 6 9

2、进阶示例

如果列表中的元素没有实现 Comparable 接口,你不能直接使用 Collections.sort() 方法的默认版本,因为该方法需要列表中的元素能够相互比较。但是,你可以通过实现 Comparator 接口来定义元素之间的比较逻辑,并使用 Collections.sort() 的另一个版本,它接受一个 Comparator 参数。

Comparator 接口定义了一个 compare(T o1, T o2) 方法,你需要在这个方法中定义如何比较两个元素。

以下是一个示例,展示了如何对一个包含自定义对象的列表进行排序,这些对象没有实现 Comparable 接口:

	public class SortWithComparatorExample {  public static void main(String[] args) {  List<Person> people = new ArrayList<>();  people.add(new Person("Alice", 30));  people.add(new Person("Bob", 20));  people.add(new Person("Charlie", 25));  // 使用自定义的 Comparator 进行排序  Collections.sort(people, new Comparator<Person>() {  @Override  public int compare(Person p1, Person p2) {  // 按照年龄升序排序  return p1.getAge() - p2.getAge();  }  });  // 输出排序后的列表  for (Person person : people) {  System.out.println(person);  }  }  }

在上面的代码中,我们定义了一个 Person 类,它包含 nameage 两个属性。我们创建了一个 Person 对象的列表,并使用 Collections.sort() 方法和一个自定义的 Comparator 来按照年龄对列表进行排序。

在Comparator接口的compare方法中,返回值是一个整数,它表示了被比较的两个对象之间的相对顺序。这个返回值遵循以下约定:

  • 如果返回值小于0(通常是负数),则表示第一个对象(o1)应该排在第二个对象(o2)之前。
  • 如果返回值等于0,则表示两个对象是相等的,它们的顺序无关紧要。
  • 如果返回值大于0(通常是正数),则表示第一个对象(o1)应该排在第二个对象(o2)之后。

这个返回值用于构建排序算法中的比较逻辑。排序算法会根据compare方法的返回值来决定列表中元素的最终位置。我们也可以根据对象中的值,通过返回值自己定义排序规则。

注意,在 compare 方法中,我们简单地返回了两个 Person 对象年龄的差值。在实际应用中,你可能需要处理更复杂的比较逻辑,并考虑使用 Integer.compare(int x, int y) 这样的方法来避免整数溢出的问题。

3、 lambda 表达式比较

此外,从 Java 8 开始,你还可以使用 lambda 表达式来更简洁地定义 Comparator:

Collections.sort(people, (p1, p2) -> p1.getAge() - p2.getAge());

或者,使用 List 接口的 sort 方法(如果列表是 ArrayList 或其他支持此方法的列表实现):

people.sort((p1, p2) -> p1.getAge() - p2.getAge());

这些方法都允许你在不修改原始类的情况下对列表进行排序。

三、注意事项

列表中的元素必须实现 Comparable 接口。如果元素没有实现这个接口,那么在调用 Collections.sort() 方法时会抛出 ClassCastException。
Collections.sort() 方法使用了稳定的排序算法,即相等的元素在排序后的列表中的相对顺序与它们在原始列表中的相对顺序相同。
如果需要对列表进行自定义排序(例如,根据对象的某个特定属性进行排序),你可以实现自己的 Comparator,并使用 Collections.sort(List<T> list, Comparator<? super T> c) 方法进行排序。

四、性能

Collections.sort() 方法在内部使用了归并排序或 Timsort 算法,这些算法的时间复杂度通常是 O(n log n),其中 n 是列表中元素的数量。这意味着对于大型列表,排序操作通常是相对高效的。然而,对于非常小的列表,使用插入排序可能会更快,但 Collections.sort() 并不保证在这种情况下使用插入排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用gin框架,编写一个接收数据的api接口

功能&#xff1a;这里主要编写一个接口&#xff0c;将其json 数据存入对应的redis队列中&#xff0c;并统计每天的每小时请求数量 环境&#xff1a; go version go1.22.0 linux/amd64 平台 linux X64 步骤一 新建目录 命令如下&#xff1a; mkdir FormData 步骤二 新增…

当金蝶遇上BI,马上就能看到数据可视化效果

最近整理咨询内容时发现&#xff0c;很多企业用户在咨询时都会问是否有行业案例&#xff0c;究其原因时他们没用过BI数据分析&#xff0c;不知道BI可以做什么&#xff0c;能做到什么地步。其实&#xff0c;要知道这些东西还不简单&#xff0c;只需要注册奥威BI软件&#xff0c;…

CleanMyMac X 4.14.1中文版功能介绍及激活入口

细心的用户发现苹果Mac电脑越用越慢&#xff0c;其实这种情况是正常的&#xff0c;mac电脑用久了会产生很多的缓存文件&#xff0c;如果不及时清理会影响运行速度。macbook就会产生各种各样的垃圾文件,比如说残留的注册表或者无效的注册表,系统碎片以及毫无用处的文件等,这些的…

防御保护--第七次作业

题目 要求 在FW5和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 过程 FW5 FW3

Cesium--基于材质旋转图片

材质部分的代码如下 // 自定义材质const customMaterial new Cesium.Material({translucent: true,fabric: {uniforms: {image:circle_img,speed:30.0,},source: czm_material czm_getMaterial(czm_materialInput materialInput){czm_material material czm_getDefaultMateri…

Python之Web开发中级教程----搭建Web框架一

准备环境&#xff1a;ubuntu,Python3.6.9 一、Web应用程序的原理 接收并解析HTTP请求&#xff0c;获取客户的请求信息->处理完成请求的业务逻辑->返回处理结果HTTP响应。 Web框架的架构是这样的&#xff1a; 基于python的web框架&#xff0c;如tornado、flask、webpy都是…

matlab去除图片上的噪声

本问题来自CSDN-问答板块,题主提问。 如何利用matlab去除图片上的噪声? 一、运行效果图 左边是原图,右边是去掉噪音后的图片。 二、中文说明 中值滤波是一种常见的图像处理技术,用于去除图像中的噪声。其原理如下: 1. 滤波器移动:中值滤波器是一个小的窗口,在图像上移…

python处理csv文件

1.使用 csv_writer.writerow # 导入CSV安装包 import csv# 1. 创建文件对象 f open(文件名.csv,a,encodingutf-8)# 2. 基于文件对象构建 csv写入对象 csv_writer csv.writer(f)# 3. 构建列表头 csv_writer.writerow(["问题","答案"])list_name[] # 4. 写…

raid0、raid1、raid5、raid10选哪个?一文给你答案!

下午好&#xff0c;我的网工朋友。 关于磁盘阵列的用法&#xff0c;总有朋友对其用途与功能一知半解&#xff0c;很容易弄混。 而我们在做监控项目存储时&#xff0c;经常会用到磁盘阵列。 什么是磁盘阵列&#xff1f;为什么要做磁盘阵列&#xff1f;用什么样的磁盘阵列合适…

Buildroot 之一 详解源码及架构

在之前的博文中,我们学习了直接通过 Makefile 手动来进行构建 U-Boot 和 Linux Kernel 等,其实,目前存在多种嵌入式 Linux 环境的构建工具,其中,Buildroot 就是被广泛应用的一种。今天就来详细学习一个 Buildroot 这个自动化构建工具。 Buildroot Buildroot 是一个运行于…

Jenkins Pipeline实现Golang项目的CI/CD

Jenkins Pipeline实现Golang项目的CI/CD 背景 最近新增了一个Golang实现的项目&#xff0c;需要接入到现有的流水线架构中。 流程图 这边流程和之前我写过的一篇《基于Jenkins实现的CI/CD方案》差不多&#xff0c;不一样的是构建现在是手动触发的&#xff0c;没有配置webho…

IOT的发展历程及其优势——青创智通

工业互联网-物联网-设备改造-IOT-青创智通 ​随着科技的不断发展&#xff0c;物联网&#xff08;IoT&#xff09;已经逐渐成为了我们生活中不可或缺的一部分。IoT是指通过互联网将各种物理设备连接起来&#xff0c;实现设备之间的数据交换和智能化控制。IoT的发展不仅改变了我们…

Window10数据库崩溃启动失败,MySQL8.0.30通过data文件夹恢复数据库到Docker

背景&#xff1a; 昨天关机前还在使用mysql&#xff0c;一切正常&#xff0c;但今天打开电脑&#xff0c;发现mysql启动不起来了&#xff0c;老是提示端口占用&#xff0c;但是系统也没有新安装什么软件&#xff0c;而且通过查询nat命令也没发现3306端口占用。而且修改成3307等…

组态软件的概念

一、前言 组态软件是一种用于设计、配置和管理自动化系统的软件。它可以帮助用户快速地创建和修改自动化系统的界面、逻辑和通信功能&#xff0c;从而提高生产效率和质量。 二、组态软件的定义 组态软件是一种集成开发环境&#xff0c;用于设计、配置和管理自动化系统。它通…

两会声音|中国石化人大代表:要突出战略性新兴产业、未来产业的位置

十四届全国人大二次会议即将闭幕&#xff0c;“新质生产力”首次写入政府工作报告&#xff0c;并出现在了重要位置。政府工作报告主要从推动产业链供应链优化升级、积极培育新兴产业和未来产业、深入推进数字经济创新发展等三个方面进行了阐述和规划。 全国两会期间&#xff0c…

2024 年系统架构设计师(全套资料)

2024年5月系统架构设计师最新第2版教材对应的全套视频教程、历年真题及解析、章节分类真题及解析、论文写作及范文、教材、讲义、模拟题、答题卡等资料 1、2023年11月最新第2版本教材对应全套教程视频&#xff0c;2022年、2021年、2020年、2018年、2016年五套基础知识精讲视频、…

搭建nacos集群,并通过nginx实现负载均衡

nacos、eureka、consul、zookeeper等都是常用的微服务注册中心&#xff0c;这篇文章详细介绍一下在Ubuntu操作系统上搭建一个nacos的集群&#xff0c;以及通过nginx的反向代理功能实现nacos的负载均衡。 目录 一、安装nacos 1、安装nacos 2、修改nacos配置文件 3、创建naco…

学习JAVA的第十九天(基础)

目录 File 成员方法&#xff08;判断和获取&#xff09; 成员方法&#xff08;创建和删除&#xff09; 成员方法&#xff08;获取并遍历&#xff09; IO流 FileOutputStream FileInputStream 文件拷贝 前言&#xff1a;学习JAVA的第十八天&#xff08;基础&#xff09;…

【C语言】Linux内核pci_read_config_和pci_write_config_

一、pci_read_config_讲解 这些函数是Linux内核中用于从PCI设备的配置空间读取信息的函数。配置空间是PCI设备的一小块内存&#xff0c;它存储了关于该设备的重要信息&#xff0c;例如设备ID、供应商ID、中断设置等。 pci_read_config_byte、pci_read_config_word、pci_read_c…

章六、集合(1)—— 概念、API、List 接口及实现类、集合迭代

零、 关闭IDEA调试时自动隐藏空元素 一、 集合的概念 存储一个班学员信息&#xff0c;假定一个班容纳20名学员 当我们需要保存一组一样&#xff08;类型相同&#xff09;的元素的时候&#xff0c;我们应该使用一个容器来存储&#xff0c;数组就是这样一个容器。 数组有什么缺…