Collections.sort方法用于对List进行排序,支持自然顺序和自定义Comparator两种方式,底层使用稳定的TimSort算法,时间复杂度为O(n log n),需注意null处理、列表可修改性及比较逻辑性能。

Collections.sort
List
Collections.sort
1. 使用元素的自然顺序排序
如果你的列表中的元素类型实现了
Comparable
String
Integer
Comparable
Collections.sort
立即学习“Java免费学习笔记(深入)”;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SortExample {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Charlie");
names.add("Bob");
names.add("David");
System.out.println("原始列表: " + names); // 输出: 原始列表: [Alice, Charlie, Bob, David]
Collections.sort(names); // 使用String的自然顺序(字母顺序)排序
System.out.println("排序后列表: " + names); // 输出: 排序后列表: [Alice, Bob, Charlie, David]
List<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);
System.out.println("原始数字列表: " + numbers); // 输出: 原始数字列表: [5, 2, 8, 1]
Collections.sort(numbers); // 使用Integer的自然顺序(数值大小)排序
System.out.println("排序后数字列表: " + numbers); // 输出: 排序后数字列表: [1, 2, 5, 8]
}
}2. 使用自定义比较器(Comparator)排序
很多时候,我们列表里的对象并没有实现
Comparable
Comparator
Comparator
compare(T o1, T o2)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
public class CustomSortExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 35));
people.add(new Person("David", 25)); // 注意David和Bob年龄相同
System.out.println("原始人员列表: " + people);
// 按照年龄升序排序
Collections.sort(people, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.age, p2.age); // p1.age - p2.age 也可以,但Integer.compare更安全,避免溢出
}
});
System.out.println("按年龄排序后: " + people);
// 输出可能为: [Person{name='Bob', age=25}, Person{name='David', age=25}, Person{name='Alice', age=30}, Person{name='Charlie', age=35}]
// Java 8 以后,可以使用Lambda表达式,更简洁
// 按照年龄升序,年龄相同则按姓名升序
Collections.sort(people, (p1, p2) -> {
int ageCompare = Integer.compare(p1.age, p2.age);
if (ageCompare == 0) {
return p1.name.compareTo(p2.name); // 年龄相同,按姓名排序
}
return ageCompare;
});
System.out.println("按年龄和姓名排序后: " + people);
// 输出: [Person{name='Bob', age=25}, Person{name='David', age=25}, Person{name='Alice', age=30}, Person{name='Charlie', age=35}]
// 实际输出会因为David和Bob的原始顺序而定,因为TimSort是稳定排序,但这里我们用姓名做了二次排序,会重新确定他们的顺序。
// 正确输出应为: [Person{name='Bob', age=25}, Person{name='David', age=25}, Person{name='Alice', age=30}, Person{name='Charlie', age=35}]
}
}这个例子里,我个人觉得Lambda表达式的写法真是太香了,极大地简化了代码,让排序逻辑一目了然。
这个问题问得非常好,在Java 8及更高版本中,
List
sort()
简单来说,
Collections.sort(List<T> list, Comparator<? super T> c)
java.util.Collections
List
Comparator
List
而
List.sort(Comparator<? super E> c)
java.util.List
List
List
Comparator
null
Comparable
Collections.sort(List)
list.sort(Comparator.naturalOrder())
从实现层面看,
List.sort()
Arrays.sort()
List
List
Collections.sort()
TimSort
我个人倾向于在Java 8及更高版本中使用List.sort()
List.sort()
list.sort((o1, o2) -> ...)
List.sort()
List
不过,这不意味着
Collections.sort()
Collections
为自定义对象实现排序,通常有两种主流的方式:实现
Comparable
Comparator
1. 实现Comparable
当你的自定义类有一个“默认的”或“自然的”排序方式时,比如一个
Student
Student
Comparable<Student>
compareTo
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Student implements Comparable<Student> {
String name;
int studentId;
int age;
public Student(String name, int studentId, int age) {
this.name = name;
this.studentId = studentId;
this.age = age;
}
@Override
public String toString() {
return "Student{name='" + name + "', studentId=" + studentId + ", age=" + age + '}';
}
@Override
public int compareTo(Student other) {
// 默认按照学号升序排序
return Integer.compare(this.studentId, other.studentId);
}
}
public class ComparableExample {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Zhang San", 103, 20));
students.add(new Student("Li Si", 101, 22));
students.add(new Student("Wang Wu", 102, 21));
System.out.println("原始学生列表: " + students);
Collections.sort(students); // 使用Student的自然顺序(学号)排序
System.out.println("按学号排序后: " + students);
// 输出: [Student{name='Li Si', studentId=101, age=22}, Student{name='Wang Wu', studentId=102, age=21}, Student{name='Zhang San', studentId=103, age=20}]
}
}这种方式的好处是,一旦实现了
Comparable
Comparable
Collections.sort(List)
Arrays.sort(Object[])
2. 使用Comparator
启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
0
当你的对象没有自然顺序,或者你需要根据不同的业务场景提供多种排序方式时,
Comparator
Comparator
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
// 假设Person类没有实现Comparable
class PersonComparator {
String name;
int age;
public PersonComparator(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
@Override
public String toString() {
return "PersonComparator{name='" + name + '\'' + ", age=" + age + '}';
}
}
public class ComparatorExample {
public static void main(String[] args) {
List<PersonComparator> people = new ArrayList<>();
people.add(new PersonComparator("Alice", 30));
people.add(new PersonComparator("Bob", 25));
people.add(new PersonComparator("Charlie", 35));
people.add(new PersonComparator("David", 25));
System.out.println("原始人员列表: " + people);
// 方式一:匿名内部类实现Comparator,按年龄降序
Collections.sort(people, new Comparator<PersonComparator>() {
@Override
public int compare(PersonComparator p1, PersonComparator p2) {
return Integer.compare(p2.age, p1.age); // p2.age - p1.age 实现降序
}
});
System.out.println("按年龄降序后: " + people);
// 方式二:Lambda表达式实现Comparator,按姓名升序
Collections.sort(people, (p1, p2) -> p1.name.compareTo(p2.name));
System.out.println("按姓名升序后: " + people);
// 方式三:使用Comparator.comparing() 和 thenComparing() 链式调用,按年龄升序,年龄相同按姓名降序
Collections.sort(people, Comparator.comparing(PersonComparator::getAge) // 先按年龄升序
.thenComparing(PersonComparator::getName, Comparator.reverseOrder())); // 年龄相同,按姓名降序
System.out.println("按年龄升序,姓名降序后: " + people);
// 输出: [PersonComparator{name='David', age=25}, PersonComparator{name='Bob', age=25}, PersonComparator{name='Alice', age=30}, PersonComparator{name='Charlie', age=35}]
// 注意David和Bob的顺序,因为David的字母序在B之后,所以降序后David在前。
}
}Java 8引入的
Comparator.comparing()
thenComparing()
使用
Collections.sort()
1. 性能(时间复杂度与空间复杂度)
Collections.sort()
O(n log n)
O(n)
O(n)
2. 稳定性
TimSort是一个稳定的排序算法。这意味着如果列表中存在两个“相等”的元素(即它们的
compareTo
compare
3. 对null
这是个常见的陷阱。如果你的列表中包含
null
Collections.sort(List)
null
NullPointerException
null
compareTo
如果你使用自定义
Comparator
Comparator
null
compare
null
// 示例:处理null的Comparator
Collections.sort(myList, (o1, o2) -> {
if (o1 == null && o2 == null) return 0;
if (o1 == null) return -1; // null排在前面
if (o2 == null) return 1; // null排在后面
// 正常比较逻辑
return o1.someProperty.compareTo(o2.someProperty);
});4. 列表的可修改性
Collections.sort()
List
List
Collections.unmodifiableList()
UnsupportedOperationException
5. 线程安全
Collections.sort()
List
ConcurrentModificationException
synchronized
ReentrantLock
6. compareTo
compare
虽然
Collections.sort()
compareTo
compare
Comparable
Comparator
总的来说,
Collections.sort()
以上就是Java中Collections.sort方法使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号