ぽこやかざん雑記

データエンジニア / 下町モルモット / 広島カープファン / 深夜の馬鹿力 / おくやま

JavaのArrays.sortとCollections.sortの違い

Javaでは、配列やコレクションをソートするためにArrays.sort()Collections.sort()の2つのメソッドがよく使われる。
たまにどっちのメソッドを使うべきか混乱するので、違いと具体的な使用例についてメモ。

Arrays.sort()

Arrays.sort()メソッドは、Java配列(プリミティブ型やオブジェクト型)をソートするために使用される。
これはjava.util.Arraysクラスの静的メソッドとして提供されていて、配列の要素を自然順序またはカスタムのComparatorを使用してソートする。

使用例: 8x2の2次元配列のソート

以下の例では、8x2の2次元配列を、各行の2番目の要素を基準にソートしている。

import java.util.*;

public class ArraysSortExample {
    public static void main(String[] args) {
        int[][] array = {
            {5, 2},
            {1, 4},
            {3, 1},
            {8, 3},
            {7, 6},
            {6, 5},
            {4, 7},
            {2, 8}
        };

        Arrays.sort(array, Comparator.comparingInt(a -> a[1]));

        for (int[] row : array) {
            System.out.println(Arrays.toString(row));
        }
    }
}

出力

[3, 1]
[5, 2]
[8, 3]
[1, 4]
[6, 5]
[7, 6]
[4, 7]
[2, 8]

Collections.sort()

Collections.sort()メソッドは、Listインターフェースを実装するコレクションをソートするために使用される。
これはjava.util.Collectionsクラスの静的メソッドとして提供されていて、リストの要素を自然順序またはカスタムのComparatorを使用してソートする。

使用例: List<List>のソート

以下の例では、List<List<Integer>>形式のコレクションを、各リストの2番目の要素を基準にソートしている。

import java.util.*;

public class Memo {
    public static void main(String[] args) {
        List<List<Integer>> lst = new ArrayList<>();
        lst.add(Arrays.asList(5, 2));
        lst.add(Arrays.asList(1, 4));
        lst.add(Arrays.asList(3, 1));
        lst.add(Arrays.asList(8, 3));
        lst.add(Arrays.asList(7, 6));
        lst.add(Arrays.asList(6, 5));
        lst.add(Arrays.asList(4, 7));
        lst.add(Arrays.asList(2, 8));

        Collections.sort(lst, Comparator.comparingInt(list -> list.get(1)));

        for (List<Integer> list : lst) {
            System.out.println(list);
        }
    }
}

出力

[3, 1]
[5, 2]
[8, 3]
[1, 4]
[6, 5]
[7, 6]
[4, 7]
[2, 8]

その他の違い

ソートアルゴリズム

Arrays.sort() はデータの型やサイズに応じて異なるソートアルゴリズム(デュアルピボットクイックソート、ティムソートなど)を使用する。

Collections.sort()Java 7以降、内部でArrays.sort()を使用するようになったため、基本的には同じアルゴリズムを使用する。

パフォーマンス

両者の間に大きな違いはない。
ただし、Collections.sort()は内部で配列に変換するステップがあるため、非常に大きなリストではわずかなオーバーヘッドがある可能性がある。

実践的な使用例

実際の使用例を挙げると、Arrays.sort()は単純な配列のソートに用いられ、Collections.sort()はより複雑なオブジェクトのリストやカスタムの比較ロジックが必要な場合に使われることが多い。