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]