List.sort

List의 인스턴스 메서드로 정렬합니다. Java 8+ 도입. Collections.sort() 대신 권장되는 방식입니다.

시그니처

default void sort(Comparator<? super E> c)
매개변수동작
null자연 순서 (Comparable 사용) — 오름차순
Comparator커스텀 정렬

동작 추적

List<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5));
[ 초기 상태 ]
list: [3, 1, 4, 1, 5]

null로 자연 순서 정렬

list.sort(null);
[ 변경 후 ]
list: [1, 1, 3, 4, 5]   ← 오름차순 (Comparable 사용)

Comparator로 커스텀 정렬

list.sort(Comparator.reverseOrder());
[ 변경 후 ]
list: [5, 4, 3, 1, 1]
list.sort((a, b) -> b - a);          // 내림차순 (람다)
list.sort(Comparator.naturalOrder()); // 오름차순 (명시적)

list.sort() vs Collections.sort()

// 동일한 동작 — 둘 다 가능
list.sort(null);
Collections.sort(list);

// Java 8 소스코드:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);   // ← 내부적으로 list.sort() 호출
}
항목list.sort()Collections.sort()
호출 방식인스턴스 메서드정적 메서드
등장Java 8Java 1.2
구현체별 최적화O 가능 (오버라이드)X 어려움
선호도Java 8+ 권장기존 코드 호환용

메서드 호출이 한 단계 짧고, List 구현체가 자체 최적화 가능 (예: ArrayList는 내부 배열 직접 정렬).

자주 쓰는 패턴

객체 List 정렬 (Comparator 체이닝)

class Student { String name; int score; }
List<Student> students = ...;

// 점수 내림차순, 같으면 이름 오름차순
students.sort(
    Comparator.comparingInt(Student::getScore).reversed()
        .thenComparing(Student::getName)
);

정렬 후 첫/끝 원소

List<Integer> nums = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5));
nums.sort(null);
int min = nums.get(0);                    // 1
int max = nums.get(nums.size() - 1);      // 5

부분 정렬 — 직접 지원 안 함

// X List.sort에는 fromIndex/toIndex 버전 없음

// O subList로 부분 정렬 (subList는 원본의 뷰)
List<Integer> list = new ArrayList<>(Arrays.asList(5, 4, 3, 2, 1));
list.subList(1, 4).sort(null);
// list: [5, 2, 3, 4, 1]
[ 동작 추적 ]
list: [5, 4, 3, 2, 1]
list.subList(1, 4)            ← 인덱스 1~3 뷰: [4, 3, 2]
.sort(null)                    ← 뷰를 정렬 → [2, 3, 4]
                                  원본도 변경됨 (뷰는 같은 메모리)
list: [5, 2, 3, 4, 1]

자주 하는 실수

변경 불가능한 List

List<Integer> list = List.of(3, 1, 2);
list.sort(null);   // UnsupportedOperationException

Arrays.asList()의 함정

// Arrays.asList는 고정 크기지만 정렬은 가능
List<Integer> list = Arrays.asList(3, 1, 2);
list.sort(null);   // O 동작
list.add(4);       // X UnsupportedOperationException

다른 정렬 방법과 비교

방법대상반환in-place
Arrays.sort배열voidO
Collections.sortListvoidO
List.sortListvoidO
Stream.sorted모든 컬렉션새 StreamX
Arrays.parallelSort배열voidO

시간복잡도

평균최악공간
O(n log n)O(n log n)O(n)

내부적으로 팀소트(Tim Sort) 사용 — 안정 정렬.

CSLOG에서 보기