刷題時很常出現 Array 的結構如 int[]、char[] 等等…,故在這邊條列一些常用的 Arrays 方法。這次主要整理下 Java 中 Arrays 類的常用方法,在使用過程也可以複習 java 提供的工具類,還有一些泛型的坑…


主要介紹 java.lang.Object 的 java.util.Arrays 類, 承前可知道 Arrays 類位於 java.util 包中。

Arrays.copyOf()

array 是 reference 傳遞的,想要實現 value 傳遞,則使用 copyOf()

copyOf() 有參數要傳,分別是

  • 要複製的 array
  • 期望的 length

int[] nums = {1, 4, 3, 2, 6, 9, 8};
int[] newNums = Arrays.copyOf(nums, nums.length);

System.out.println(nums); // [I@6379eb
System.out.println(newNums); // [I@294425a7 , 深拷貝,地址不一樣了

// 期望的 length 可以比要複製的 array 的長度還短,不會報錯
int[] lessLengthArray = Arrays.copyOf(nums, nums.length - 3);
System.out.println(Arrays.toString( lessLengthArray )); //[1, 4, 3, 2]

一樣再提醒, array 使用 toString() 方法,是列出地址 !

System.out.println(nums.toString()); // [I@564fabc8

要列出內容,使用 Arrays.toString() 方法

System.out.println(Arrays.toString( lessLengthArray )); //[1, 4, 3, 2]


Arrays.copyOfRange(T[] original, int from, int to)

拷貝指定起始位置和結束位置的陣列

int[] nums = {1, 4, 3, 2, 6, 9, 8};
int[] newNums = Arrays.copyOfRange( nums, 2, 5 );
System.out.println(Arrays.toString( newNums )); // [3, 2, 6]

// 如果超過原陣列長度,則會用 null 或者基礎類型的預設值進行填充。
int[] nums1 = {1, 4, 3, 2, 6, 9, 8};
int[] newNums1 = Arrays.copyOfRange( nums1, 2, 10 );
System.out.println(Arrays.toString( newNums1 )); // [3, 2, 6, 9, 8, 0, 0, 0]

Integer[] nums2 = {1, 4, 3, 2, 6, 9, 8};
Integer[] newNums2 = Arrays.copyOfRange( nums2, 2, 10 );
System.out.println(Arrays.toString( newNums2 )); // [3, 2, 6, 9, 8, null, null, null]

起始位置 from index, 不能超出範圍,會報 java.lang.ArrayIndexOutOfBoundsException

起始位置和結束位置設一樣的話,是複製給你一個空的 array


Arrays.toString()

前例知道直接使用 nums.toString(),會得到一個 reference 地址。故 Arrays.toString() 可以幫助我們快速列出內容。

Arrays.toString() 方法可以把 array 內容 print 出來。

// 承前範例 nums = {1, 4, 3, 2, 6, 9, 8}
System.out.println(nums); // [I@564fabc8
System.out.println(Arrays.toString(nums)); // [1, 4, 3, 2, 6, 9, 8]

Arrays.sort

默認升序

Arrays.sort(nums)

// 以下會出錯,要用 Integer[] 才行
// Arrays.sort(ints, Collections.reverseOrder() );

這就是坑…, Collections.reverseOrder() 有用到泛型,故要使用 Integer[] 才可以通過編譯。

Integer[] ints = {1, 4, 3, 2, 6, 9, 8};
Arrays.sort(ints, Collections.reverseOrder() ); // [9, 8, 6, 4, 3, 2, 1]


獲取 array 中最大值、最小值

最後需要 getAsInt() 方法是因為 stream 出來會是 optional 類型

int minNum = Arrays.stream(nums).min().getAsInt();
int minNum = Arrays.stream(nums).max().getAsInt();

Arrays.fill()

此方法可填充 value 至指定 index 範圍,若沒寫 index 範圍則代表全部置換

// Arrays.fill(arrayname,value)
// Arrays.fill(arrayname ,starting index ,ending index ,value)
int[] nums = {1, 4, 3, 2, 6, 9, 8};
Arrays.fill(nums, 11);
System.out.println(Arrays.toString( nums )); // [11, 11, 11, 11, 11, 11, 11]
// Arrays.fill(arrayname ,starting index ,ending index ,value)
int[] nums = {1, 4, 3, 2, 6, 9, 8};
Arrays.fill(nums, 2, 5, 11);
System.out.println(Arrays.toString( nums ));
// index  [0, 1, 2 , 3 , 4 , 5, 6]
// origin [1, 4, 3 , 2 , 6 , 9, 8]
// array  [1, 4, 11, 11, 11, 9, 8]

起始位置和結束位置都不能超出範圍,會報錯 java.lang.ArrayIndexOutOfBoundsException

起始位置和結束位置一樣的話(不能超出範圍),原 array 不會變動


Arrays.deepToString()

打印多維array

int[][] mat = new int[2][2];
mat[0][0] = 99;
mat[0][1] = 151;
mat[1][0] = 30;
mat[1][1] = 5;
System.out.println(Arrays.deepToString(mat)); //[[99, 151], [30, 5]]

Arrays.equals(Object[] array1, Object[] array2)

判斷兩個陣列是否相等

  • 陣列元素為基本類型時,依次比較值
  • 陣列元素為Object類型時,依次調用元素的 equals() 方法進行比較
int[] nums1 = {1, 4, 3, 2, 6, 9, 8};
int[] nums2 = {1, 4, 3, 2, 6, 9, 8};
System.out.println( Arrays.equals( nums1, nums2 ) ); // true

還有一個 Arrays.deepEquals(),就不詳細說明了


Arrays.stream(T[] array)

返回陣列的 Stream,然後我們就可以使用 Stream 相關的許多方法了

// int[] 轉成 List<Integer>
int[] nums = { 1, 4, 3, 2, 6, 9, 8 };
List<Integer> collect = Arrays.stream( nums )
				.boxed()
				.collect( Collectors.toList() );
System.out.println( collect ); // [1, 4, 3, 2, 6, 9, 8]

特別注意很有多 java 方法都帶有泛型,所以 int[] 和 Integer[] 都可能會踩到各式各樣的坑。