JAVA中Collections.sort()方法使用详解

 更新时间:2024年05月16日 11:09:38   作者:CodeCharm——CC  
这篇文章主要给大家介绍了关于JAVA中Collections.sort()方法使用的相关资料,Java中Collections.sort()方法是用来对List类型进行排序的,文中通过代码将使用的方法介绍的非常详细,需要的朋友可以参考下

一、简介

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 类,它包含 name 和 age 两个属性。我们创建了一个 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() 并不保证在这种情况下使用插入排序。

到此这篇关于JAVA中Collections.sort()方法使用详解的文章就介绍到这了,更多相关JAVA Collections.sort()方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java如何实现防止恶意注册

    详解Java如何实现防止恶意注册

    恶意注册通常是指使用自动化脚本或者机器人在短时间内进行大量的注册行为,这种行为会对系统造成压力,甚至会导致系统瘫痪。所以本文为大家总结了一些防止恶意注册的方法,需要的可以参考一下
    2023-04-04
  • MyBatis中获取Mysql数据库插入记录的主键值的实现

    MyBatis中获取Mysql数据库插入记录的主键值的实现

    本文主要介绍了MyBatis中获取Mysql数据库插入记录的主键值的实现,包含了三种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • springboot实现文件上传和下载功能

    springboot实现文件上传和下载功能

    这篇文章主要为大家详细介绍了springboot实现文件上传和下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • idea 解决用骨架创建项目过慢的操作方式

    idea 解决用骨架创建项目过慢的操作方式

    这篇文章主要介绍了idea 解决用骨架创建项目过慢的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java中@Pattern注解常用的校验正则表达式学习笔记

    Java中@Pattern注解常用的校验正则表达式学习笔记

    对于正则这个东西,对我来说一直是很懵逼的,每次用每次查,然后还是记不住,下面这篇文章主要给大家介绍了关于Java中@Pattern注解常用的校验正则表达式学习笔记的相关资料,需要的朋友可以参考下
    2022-07-07
  • Spring JPA学习之delete方法示例详解

    Spring JPA学习之delete方法示例详解

    这篇文章主要为大家介绍了Spring JPA学习delete方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法

    Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法

    这篇文章主要介绍了Spring Security实现基于RBAC的权限表达式动态访问控制,资源权限表达式动态权限控制在Spring Security也是可以实现的,首先开启方法级别的注解安全控制,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Maven deploy plugin使用方式

    Maven deploy plugin使用方式

    这篇文章主要介绍了Maven deploy plugin使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Mybatis中的@Param及动态SQL详解

    Mybatis中的@Param及动态SQL详解

    这篇文章主要介绍了Mybatis中的@Param及动态SQL详解,@Param是MyBatis所提供的作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,需要的朋友可以参考下
    2023-10-10
  • SpringCloud+SpringBoot项目搭建结构层次的实例

    SpringCloud+SpringBoot项目搭建结构层次的实例

    这篇文章详细介绍了SpringCloud项目的架构层次及其搭建经验,包括Controller层、Service层、Repository层、Entity层、DTO层、Exception层等,通过文字和图片的形式,帮助读者理解如何组织和实现一个SpringBoot项目的不同层次
    2025-01-01

最新评论