JAVA中Collections.sort()方法使用詳解
一、簡介
Collections.sort() 是 Java 集合框架(Java Collections Framework)中的一個(gè)靜態(tài)方法,用于對(duì)列表(List)中的元素進(jìn)行排序。此方法利用了 Java 的泛型機(jī)制,可以很方便地對(duì)各種類型的列表進(jìn)行排序。
- 源碼方法體:

- 參數(shù)
list:需要排序的列表。列表中的元素必須實(shí)現(xiàn)了 Comparable 接口,以便能夠比較它們的大小。
二、使用示例
1、普通使用
假設(shè)你有一個(gè) Integer 類型的列表,你可以使用 Collections.sort() 方法對(duì)它進(jìn)行排序:
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、進(jìn)階示例
如果列表中的元素沒有實(shí)現(xiàn) Comparable 接口,你不能直接使用 Collections.sort() 方法的默認(rèn)版本,因?yàn)樵摲椒ㄐ枰斜碇械脑啬軌蛳嗷ケ容^。但是,你可以通過實(shí)現(xiàn) Comparator 接口來定義元素之間的比較邏輯,并使用 Collections.sort() 的另一個(gè)版本,它接受一個(gè) Comparator 參數(shù)。
Comparator 接口定義了一個(gè) compare(T o1, T o2) 方法,你需要在這個(gè)方法中定義如何比較兩個(gè)元素。
以下是一個(gè)示例,展示了如何對(duì)一個(gè)包含自定義對(duì)象的列表進(jìn)行排序,這些對(duì)象沒有實(shí)現(xiàn) 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 進(jìn)行排序
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);
}
}
}
在上面的代碼中,我們定義了一個(gè) Person 類,它包含 name 和 age 兩個(gè)屬性。我們創(chuàng)建了一個(gè) Person 對(duì)象的列表,并使用 Collections.sort() 方法和一個(gè)自定義的 Comparator 來按照年齡對(duì)列表進(jìn)行排序。
在Comparator接口的compare方法中,返回值是一個(gè)整數(shù),它表示了被比較的兩個(gè)對(duì)象之間的相對(duì)順序。這個(gè)返回值遵循以下約定:
- 如果返回值小于0(通常是負(fù)數(shù)),則表示第一個(gè)對(duì)象(o1)應(yīng)該排在第二個(gè)對(duì)象(o2)之前。
- 如果返回值等于0,則表示兩個(gè)對(duì)象是相等的,它們的順序無關(guān)緊要。
- 如果返回值大于0(通常是正數(shù)),則表示第一個(gè)對(duì)象(o1)應(yīng)該排在第二個(gè)對(duì)象(o2)之后。
這個(gè)返回值用于構(gòu)建排序算法中的比較邏輯。排序算法會(huì)根據(jù)compare方法的返回值來決定列表中元素的最終位置。我們也可以根據(jù)對(duì)象中的值,通過返回值自己定義排序規(guī)則。
注意,在 compare 方法中,我們簡單地返回了兩個(gè) Person 對(duì)象年齡的差值。在實(shí)際應(yīng)用中,你可能需要處理更復(fù)雜的比較邏輯,并考慮使用 Integer.compare(int x, int y) 這樣的方法來避免整數(shù)溢出的問題。
3、 lambda 表達(dá)式比較
此外,從 Java 8 開始,你還可以使用 lambda 表達(dá)式來更簡潔地定義 Comparator:
Collections.sort(people, (p1, p2) -> p1.getAge() - p2.getAge());
或者,使用 List 接口的 sort 方法(如果列表是 ArrayList 或其他支持此方法的列表實(shí)現(xiàn)):
people.sort((p1, p2) -> p1.getAge() - p2.getAge());
這些方法都允許你在不修改原始類的情況下對(duì)列表進(jìn)行排序。
三、注意事項(xiàng)
列表中的元素必須實(shí)現(xiàn) Comparable 接口。如果元素沒有實(shí)現(xiàn)這個(gè)接口,那么在調(diào)用 Collections.sort() 方法時(shí)會(huì)拋出 ClassCastException。
Collections.sort() 方法使用了穩(wěn)定的排序算法,即相等的元素在排序后的列表中的相對(duì)順序與它們?cè)谠剂斜碇械南鄬?duì)順序相同。
如果需要對(duì)列表進(jìn)行自定義排序(例如,根據(jù)對(duì)象的某個(gè)特定屬性進(jìn)行排序),你可以實(shí)現(xiàn)自己的 Comparator,并使用 Collections.sort(List<T> list, Comparator<? super T> c) 方法進(jìn)行排序。
四、性能
Collections.sort() 方法在內(nèi)部使用了歸并排序或 Timsort 算法,這些算法的時(shí)間復(fù)雜度通常是 O(n log n),其中 n 是列表中元素的數(shù)量。這意味著對(duì)于大型列表,排序操作通常是相對(duì)高效的。然而,對(duì)于非常小的列表,使用插入排序可能會(huì)更快,但 Collections.sort() 并不保證在這種情況下使用插入排序。
到此這篇關(guān)于JAVA中Collections.sort()方法使用詳解的文章就介紹到這了,更多相關(guān)JAVA Collections.sort()方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中Collections.sort排序函數(shù)用法詳解
- JAVA對(duì)list集合進(jìn)行排序Collections.sort()
- Java?Collections.sort()實(shí)現(xiàn)List排序的默認(rèn)方法和自定義方法
- java中Collections.sort排序詳解
- Java Collections.sort()排序代碼案例
- 詳解java Collections.sort的兩種用法
- Java使用Collections.sort()排序的示例詳解
- Java使用Collections.sort()排序的方法
- Java中Collections.sort的使用
相關(guān)文章
詳解Java如何實(shí)現(xiàn)防止惡意注冊(cè)
惡意注冊(cè)通常是指使用自動(dòng)化腳本或者機(jī)器人在短時(shí)間內(nèi)進(jìn)行大量的注冊(cè)行為,這種行為會(huì)對(duì)系統(tǒng)造成壓力,甚至?xí)?dǎo)致系統(tǒng)癱瘓。所以本文為大家總結(jié)了一些防止惡意注冊(cè)的方法,需要的可以參考一下2023-04-04
MyBatis中獲取Mysql數(shù)據(jù)庫插入記錄的主鍵值的實(shí)現(xiàn)
本文主要介紹了MyBatis中獲取Mysql數(shù)據(jù)庫插入記錄的主鍵值的實(shí)現(xiàn),包含了三種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
springboot實(shí)現(xiàn)文件上傳和下載功能
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)文件上傳和下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
idea 解決用骨架創(chuàng)建項(xiàng)目過慢的操作方式
這篇文章主要介紹了idea 解決用骨架創(chuàng)建項(xiàng)目過慢的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記
對(duì)于正則這個(gè)東西,對(duì)我來說一直是很懵逼的,每次用每次查,然后還是記不住,下面這篇文章主要給大家介紹了關(guān)于Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記的相關(guān)資料,需要的朋友可以參考下2022-07-07
Spring JPA學(xué)習(xí)之delete方法示例詳解
這篇文章主要為大家介紹了Spring JPA學(xué)習(xí)delete方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Spring?Security實(shí)現(xiàn)基于RBAC的權(quán)限表達(dá)式動(dòng)態(tài)訪問控制的操作方法
這篇文章主要介紹了Spring?Security實(shí)現(xiàn)基于RBAC的權(quán)限表達(dá)式動(dòng)態(tài)訪問控制,資源權(quán)限表達(dá)式動(dòng)態(tài)權(quán)限控制在Spring Security也是可以實(shí)現(xiàn)的,首先開啟方法級(jí)別的注解安全控制,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
Mybatis中的@Param及動(dòng)態(tài)SQL詳解
這篇文章主要介紹了Mybatis中的@Param及動(dòng)態(tài)SQL詳解,@Param是MyBatis所提供的作為Dao層的注解,作用是用于傳遞參數(shù),從而可以與SQL中的的字段名相對(duì)應(yīng),需要的朋友可以參考下2023-10-10
SpringCloud+SpringBoot項(xiàng)目搭建結(jié)構(gòu)層次的實(shí)例
這篇文章詳細(xì)介紹了SpringCloud項(xiàng)目的架構(gòu)層次及其搭建經(jīng)驗(yàn),包括Controller層、Service層、Repository層、Entity層、DTO層、Exception層等,通過文字和圖片的形式,幫助讀者理解如何組織和實(shí)現(xiàn)一個(gè)SpringBoot項(xiàng)目的不同層次2025-01-01

