当需要比较、复制或排序数组时,开发人员的第一直觉可能是写出循环、if 语句和处理此操作所需的其他逻辑。在大多数情况下,这将是一个错误,因为它会复制实用程序类中可用的行为java.util.Arrays。
让我们看一下如何使用类Arrays来处理数组的日常操作。
复制数组
Arrays提供了几个用于复制数组的选项。
int[] numbers = new int[] {1,2,3,4,5}; int[] copyOfNumbers = Arrays.copyOf(numbers, numbers.length); int[] copyOfSomeNumbers = Arrays.copyOf(numbers, numbers.length - 3); int[] copyOfNumbersWithPadding = Arrays.copyOf(numbers, numbers.length + 1);
|
- copyOfNumbers- 是数组简单副本的示例。
- copyOfSomeNumbers- 是仅复制数组的一部分的示例。
- copyOfNumbersWithPadding- 是复制数组并添加填充的示例。填充值是该类型的默认值;在 int情况下,即 0。
复制子范围
数组也提供了一个选项,可以通过copyOfRange(T[]. int startIndex, int endIndex)从一个数组中复制一个特定的子范围,就像下面的例子一样:
int[] numbers = new int[] {1,2,3,4,5}; int[] copyOfNumbers = Arrays.copyOfRange(numbers, 0, 3); System.out.println(Arrays.toString(numbers));//1,2,3,4,5 System.out.println(Arrays.toString(copyOfNumbers));//1,2,3
|
将数组转换为其他类型
Arrays提供了几种将数组转换为不同类型的方法,包括List、Stream、Spliterator和String:
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
Arrays.asList(numbers); Arrays.stream(numbers); Arrays.spliterator(numbers); Arrays.toString(numbers);
|
比较数组
对于比较数组,Arrays提供了几个选项,通常比默认选项提供更好的结果。让我们来看看:
int[] numbers = new int[] {1,2,3,4,5}; int[] copyOfNumbers = Arrays.copyOf(numbers, 5); System.out.println(numbers.equals(copyOfNumbers));//False System.out.println(Arrays.equals(numbers, copyOfNumbers));//True
|
在上面的例子中,numbers和copyOfNumbers持有相同的值,但是int[].equals(int[])返回的可能是意外的false。这是因为它是通过引用进行比较,而不是通过值进行比较。而Arrays.equals(T[])是通过存储在数组中的值来比较两个数组。
比较子范围
和复制一样,Arrays也有一个选项用于比较数组的子范围,就像这个例子中一样:
int[] numbers = new int[] { 1, 2, 3, 4, 5 }; int[] moreNumbers = new int[] { 1, 2, 3, 6, 7 };
System.out.println(numbers.equals(moreNumbers));// False System.out.println(Arrays.equals(numbers, moreNumbers));// False System.out.println(Arrays.equals(numbers, 0, 2, moreNumbers, 0, 2));// True
|
深度比较
当处理嵌套/多维数组时,有一个deepEquals(T[]),它可以对一个数组和任何嵌套数组进行比较:
int[][] coordinates = new int[][] { {10,20}, {100,200} }; int[][] altCoordinates = new int[][] { {10,20}, {100,200} }; System.out.println(coordinates.equals(altCoordinates));//False System.out.println(Arrays.equals(coordinates, altCoordinates));//False System.out.println(Arrays.deepEquals(coordinates, altCoordinates));//True
|
比较可比较Comparable 数组
数组也允许用compare(T[], T[])来比较包含原始值和实现Comparable类型的数组:
int[] littleNumbers = new int[] {10, 20}; int[] copyOfLittleNumbers = Arrays.copyOf(littleNumbers, 2); int[] bigNumbers = new int[] {100, 200}; System.out.println(Arrays.compare(littleNumbers, bigNumbers));//-1 System.out.println(Arrays.compare(bigNumbers, littleNumbers));//1 System.out.println(Arrays.compare(littleNumbers, copyOfLittleNumbers));//0
|
对数组进行排序
对于包含基元和实现Comparable的类型的数组,Arrays可以用sort(T[])对数组进行排序。Arrays也只能用sort(T[], startIndex, endIndex)对一个数组的子范围进行排序。注意,Arrays对传递的数组进行排序;它不会返回一个已排序数组的副本:
int[] numbers = new int[] { 3, 5, 2, 1, 4 }; int[] moreNumbers = new int[] { 3, 5, 2, 1, 4 };
System.out.println(Arrays.toString(numbers));// 3,5,2,1,4 Arrays.sort(numbers); System.out.println(Arrays.toString(numbers));// 1,2,3,4,5
System.out.println(Arrays.toString(moreNumbers));// 3,5,2,1,4 Arrays.sort(moreNumbers, 0, 3); System.out.println(Arrays.toString(moreNumbers));// 2,3,5,1,4
|
搜索数组
对于排序后的数组,Arrays 还提供了一个搜索的操作:binarySearch(T[], T key),如果键被匹配,则返回索引;如果键低于数组的范围,则返回-1;如果键高于范围,则返回数组长度+1的负数(即如果数组长度为5,则返回-6)。未排序的数组将不会返回预期的结果。下面是一个使用 binarySearch(T[], T key) 的例子:
int[] numbers = new int[] { 1, 2, 3, 4, 5};
System.out.println(Arrays.binarySearch(numbers, 4)); // 3 - insertion point in array System.out.println(Arrays.binarySearch(numbers, -0));// -1 - low value not in array // (one less than 0) System.out.println(Arrays.binarySearch(numbers, 8)); // -6 - high value not in array // (negative value of length + 1)
|