1. 介紹
在 Java 中,陣列是強大的工具,但基礎語法很快就會陷入重複瑣事。這時可以使用 java.util.Arrays —— 一組用於處理陣列的靜態方法:排序、複製、比較、格式化輸出等等。無需建立實例——所有方法都是靜態的,直接以類別名稱呼叫即可。
若要使用這些方法,請在檔案開頭加入 import:
import java.util.Arrays;
如果忘了匯入,編譯器會抱怨 Arrays「未找到」——這不是 bug,而是缺少 import 時的預期行為。
2. 陣列排序:Arrays.sort
Arrays.sort 如何運作
語法
Arrays.sort(massiv);
Arrays.sort(massiv, nachal’nyyIndeks, konechnyyIndeks);
此方法會「就地」排序——也就是修改原陣列而不回傳新陣列。想保留原本順序?請先把陣列複製一份。
範例:排序整數陣列
int[] scores = {5, 2, 9, 1, 7};
Arrays.sort(scores); // 依遞增排序
System.out.println("已排序的陣列: " + Arrays.toString(scores));
// 輸出: [1, 2, 5, 7, 9]
範例:排序字串陣列
String[] names = {"Vasya", "Petya", "Anya", "Igor"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
// [Anya, Igor, Petya, Vasya]
重要:字串依詞典序(字母順序)排序,數字依遞增排序。
只排序陣列的一部分
int[] arr = {7, 5, 3, 1, 9, 8};
Arrays.sort(arr, 1, 4); // 會排序索引 1 到 3 的元素(4 不包含)
System.out.println(Arrays.toString(arr));
// [7, 1, 3, 5, 9, 8]
特點
- 就地排序:原陣列會被修改。
- 數字預設為遞增,字串按字母順序。
- 對複雜物件,請使用帶有比較器的多載版本。
3. 填充陣列:Arrays.fill
語法
Arrays.fill(massiv, znachenie);
Arrays.fill(massiv, nachal’nyyIndeks, konechnyyIndeks, znachenie);
此方法會用相同的值填滿所有元素或指定的陣列部分。
int[] marks = new int[5];
Arrays.fill(marks, 3); // 所有元素現在都等於 3
System.out.println(Arrays.toString(marks)); // [3, 3, 3, 3, 3]
填充陣列的一部分
int[] arr = new int[10];
Arrays.fill(arr, 2, 5, 7); // 會填滿索引 2 到 4 的元素(5 不包含)
System.out.println(Arrays.toString(arr));
// [0, 0, 7, 7, 7, 0, 0, 0, 0, 0]
填充字串陣列
String[] guests = new String[4];
Arrays.fill(guests, "空");
System.out.println(Arrays.toString(guests)); // [空, 空, 空, 空]
4. 複製陣列:Arrays.copyOf 與 Arrays.copyOfRange
Arrays.copyOf
語法
Arrays.copyOf(iskhodnyyMassiv, novayaDlina);
會建立新陣列並從來源陣列複製元素。若新長度大於來源長度,尾端會以預設值填補(對 int 為 0,對參考型別為 null)。
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
System.out.println(Arrays.toString(copy)); // [1, 2, 3, 0, 0]
縮短陣列
int[] shortCopy = Arrays.copyOf(original, 2);
System.out.println(Arrays.toString(shortCopy)); // [1, 2]
Arrays.copyOfRange
語法
Arrays.copyOfRange(iskhodnyyMassiv, nachal’nyyIndeks, konechnyyIndeks);
int[] arr = {10, 20, 30, 40, 50};
int[] mid = Arrays.copyOfRange(arr, 1, 4); // 會複製索引 1 到 3 的元素
System.out.println(Arrays.toString(mid)); // [20, 30, 40]
5. 比較陣列:Arrays.equals 與 Arrays.deepEquals
在 Java 中不要用 == 比較陣列——那是比較參考,而不是內容:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a == b); // false!
如何比較內容?
Arrays.equals(massiv1, massiv2);
Arrays.deepEquals(matritsa1, matritsa2);
System.out.println(Arrays.equals(a, b)); // true
一維陣列使用 Arrays.equals,二維以上使用 Arrays.deepEquals。
範例:比較二維陣列
int[][] matrix1 = {{1, 2}, {3, 4}};
int[][] matrix2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.equals(matrix1, matrix2)); // false!
System.out.println(Arrays.deepEquals(matrix1, matrix2)); // true
6. 漂亮地輸出陣列:Arrays.toString 與 Arrays.deepToString
直接列印陣列會得到難以閱讀的字串:
int[] arr = {1, 2, 3};
System.out.println(arr); // [I@7a81197d
語法
Arrays.toString(massiv);
Arrays.deepToString(matritsa);
System.out.println(Arrays.toString(arr)); // [1, 2, 3]
int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(matrix)); // [[1, 2], [3, 4]]
7. 使用 Arrays 類別時的常見錯誤
錯誤 1:嘗試用 == 比較陣列
陣列是物件,== 只會比較參考。即使值相同,結果也會是 false。請使用一維的 Arrays.equals 或多維的 Arrays.deepEquals。
錯誤 2:忘了排序是「就地」修改
如果需要原本的順序,請先用 Arrays.copyOf 建立副本,再對副本進行排序。否則原始資料的順序會遺失。
錯誤 3:對 Arrays.fill 與 Arrays.copyOfRange 的邊界理解錯誤
這些方法使用半開區間:右邊索引不包含。例如,Arrays.fill(arr, 2, 5, 9) 會填滿索引 2、3、4,而索引 5 不會被改動。
錯誤 4:直接列印陣列
呼叫 System.out.println(arr) 會印出技術性的表示法。請對一維陣列使用 Arrays.toString,對多維陣列使用 Arrays.deepToString。
錯誤 5:用 Arrays.equals 比較多維陣列
該方法只比較最外層(內部陣列的參考)。若要比較內容,請使用 Arrays.deepEquals。
GO TO FULL VERSION