Java Arrays 類別

java.util.Arrays 提供許多操作陣列的靜態方法。

匯入

import java.util.Arrays;

轉字串 toString()

int[] arr = {1, 2, 3, 4, 5};

// 直接印出陣列會得到記憶體位址
System.out.println(arr);  // [I@1b6d3586

// 使用 toString() 印出內容
System.out.println(Arrays.toString(arr));  // [1, 2, 3, 4, 5]

排序 sort()

int[] numbers = {5, 2, 8, 1, 9};

Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));  // [1, 2, 5, 8, 9]

// 排序部分範圍
int[] arr = {5, 2, 8, 1, 9};
Arrays.sort(arr, 1, 4);  // 只排序索引 1 到 3
System.out.println(Arrays.toString(arr));  // [5, 1, 2, 8, 9]

字串排序

String[] names = {"Charlie", "Alice", "Bob"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));  // [Alice, Bob, Charlie]

// 忽略大小寫排序
String[] names2 = {"charlie", "Alice", "bob"};
Arrays.sort(names2, String.CASE_INSENSITIVE_ORDER);
System.out.println(Arrays.toString(names2));  // [Alice, bob, charlie]

降冪排序

Integer[] numbers = {5, 2, 8, 1, 9};
Arrays.sort(numbers, Collections.reverseOrder());
System.out.println(Arrays.toString(numbers));  // [9, 8, 5, 2, 1]

二分搜尋 binarySearch()

陣列必須先排序:

int[] numbers = {1, 3, 5, 7, 9};

int index = Arrays.binarySearch(numbers, 5);
System.out.println(index);  // 2

int notFound = Arrays.binarySearch(numbers, 4);
System.out.println(notFound);  // 負數(表示找不到)

填充 fill()

int[] arr = new int[5];

Arrays.fill(arr, 10);
System.out.println(Arrays.toString(arr));  // [10, 10, 10, 10, 10]

// 填充部分範圍
int[] arr2 = new int[5];
Arrays.fill(arr2, 1, 4, 99);  // 索引 1 到 3
System.out.println(Arrays.toString(arr2));  // [0, 99, 99, 99, 0]

比較 equals()

int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
int[] arr3 = {1, 2, 4};

System.out.println(arr1 == arr2);  // false(比較參考)
System.out.println(Arrays.equals(arr1, arr2));  // true
System.out.println(Arrays.equals(arr1, arr3));  // false

複製 copyOf()

int[] original = {1, 2, 3, 4, 5};

// 複製整個陣列
int[] copy = Arrays.copyOf(original, original.length);
System.out.println(Arrays.toString(copy));  // [1, 2, 3, 4, 5]

// 複製部分並增加長度
int[] longer = Arrays.copyOf(original, 8);
System.out.println(Arrays.toString(longer));  // [1, 2, 3, 4, 5, 0, 0, 0]

// 複製部分
int[] shorter = Arrays.copyOf(original, 3);
System.out.println(Arrays.toString(shorter));  // [1, 2, 3]

copyOfRange()

int[] original = {1, 2, 3, 4, 5};

int[] range = Arrays.copyOfRange(original, 1, 4);
System.out.println(Arrays.toString(range));  // [2, 3, 4]

轉換為 List

String[] arr = {"a", "b", "c"};

List<String> list = Arrays.asList(arr);
System.out.println(list);  // [a, b, c]

// 注意:這個 List 是固定大小的
// list.add("d");  // UnsupportedOperationException

// 建立可變的 List
List<String> mutableList = new ArrayList<>(Arrays.asList(arr));
mutableList.add("d");  // OK

比較陣列 compare() (Java 9+)

int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 4};

int result = Arrays.compare(arr1, arr2);
// 負數:arr1 < arr2
// 0:相等
// 正數:arr1 > arr2

多維陣列

deepToString()

int[][] matrix = {{1, 2}, {3, 4}};

System.out.println(Arrays.toString(matrix));  // 不正確
System.out.println(Arrays.deepToString(matrix));  // [[1, 2], [3, 4]]

deepEquals()

int[][] arr1 = {{1, 2}, {3, 4}};
int[][] arr2 = {{1, 2}, {3, 4}};

System.out.println(Arrays.equals(arr1, arr2));  // false
System.out.println(Arrays.deepEquals(arr1, arr2));  // true

平行排序 parallelSort() (Java 8+)

大型陣列使用多執行緒排序:

int[] largeArray = new int[1000000];
// 填充資料...

Arrays.parallelSort(largeArray);  // 使用多執行緒

Stream 轉換 stream() (Java 8+)

int[] numbers = {1, 2, 3, 4, 5};

// 轉換為 IntStream
int sum = Arrays.stream(numbers).sum();
System.out.println(sum);  // 15

// 過濾和轉換
int[] even = Arrays.stream(numbers)
    .filter(n -> n % 2 == 0)
    .toArray();
System.out.println(Arrays.toString(even));  // [2, 4]

實際應用

檢查陣列是否已排序

int[] arr = {1, 2, 3, 4, 5};

int[] sorted = Arrays.copyOf(arr, arr.length);
Arrays.sort(sorted);

boolean isSorted = Arrays.equals(arr, sorted);
System.out.println("是否已排序:" + isSorted);  // true

移除重複值

int[] arr = {1, 2, 2, 3, 3, 3, 4};

int[] unique = Arrays.stream(arr).distinct().toArray();
System.out.println(Arrays.toString(unique));  // [1, 2, 3, 4]