Collections.Sort在Java集合经常使用,但是很多同学并不了解Collections.Sort的具体用法以及底层原理,下面详解。
Collections.Sort简介
Collections.sort() 是 Java 中 Collections 类提供的一个静态方法,用于对一个实现了 List 接口的集合进行升序排序。
Collections.Sort用法
Collections.sort主要有两种用法,一种是采用自然顺序排序,一种是自定义排序规则。
1.自带排序
例如在List集合中,我们我们可以使用Collections.sort(list)自带的排序方法给集合排序,不用自己写排序算法了。
如下所示:
List numbers = new ArrayList<>(); numbers.add(5); numbers.add(2); numbers.add(9); numbers.add(1); Collections.sort(numbers); System.out.println(numbers);
输出:
[1, 2, 5, 9]
我们可以看见,Collections.sort() 方法使用元素的自然顺序进行排序好了。
2.自定义排序
如果需要使用不同的排序规则,可以传入一个自定义的 Comparator 对象来实现,如下所示:
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public static void main(String[] args) { List persons = new ArrayList<>(); persons.add(new Person("Tom", 20)); persons.add(new Person("Bob", 25)); persons.add(new Person("Alice", 18)); persons.add(new Person("Mary", 22)); Comparator ageComparator = new Comparator() { @Override public int compare(Person p1, Person p2) { return Integer.compare(p1.getAge(), p2.getAge()); } }; Collections.sort(persons, ageComparator); for (Person person : persons) { System.out.println(person.getName() ", " person.getAge()); } } }
上面我们有一个Person类,包含了姓名和年龄两个属性,我们希望按照年龄从小到大的顺序对 Person 对象进行排序。
我们使用一个匿名内部类来实现自定义的 Comparator,这个 Comparator 的实现规则是:按照 Person 对象的年龄属性进行比较。
最后,我们通过调用 Collections.sort() 方法来对 persons 列表进行排序,这就是 Collections.sort的自定排序规则的用法。
Collections.Sort实现原理
那你是否对Collections.sort()如何排序感兴趣呢,我们扒一下sort()的源码:
发现里面用到了ComparableTimSort.sort,底层属于归并排序(Merge Sort)算法。
Java 中的 Collections.sort() 具体实现是通过对集合元素进行分治,递归排序,再合并排序结果的方式来实现的。
具体来说,排序的过程如下:
- 将集合按照中间位置分成两个部分;
- 对左边部分和右边部分分别进行递归排序;
- 对已排序的两部分进行合并排序。
在实现上,归并排序可以通过一个辅助数组来存储排序结果,最后再将排序结果复制回原数组。
以上就是Collections.Sort详解,更多Java集合框架,请查看:Java集合框架详解(看这篇就够了)。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》