java.util.Arrays
Arrays 类中包含了用于操作数组的各种方法(如排序和搜索),还包含一个静态工厂,可以将数组视为列表。
除非另有说明,如果指定的数组引用为 null,则该类中的方法都会抛出 NullPointerException 异常。
该类的实现者可以自定义替代该类中的方法,只要符合规范即可,比如,sort(object[]) 方法不必是一个合并排序算法,但一定要是稳定的。
此类是 Java Collections Framework 的成员。
常用的方法:
以下函数没有特殊说明的情况下,可以将 int 类型数组替换成 byte, char, double, float, long, Object, short, T(自定义)类型,用法不变。
static int binarySearch(int[] a, int key) - 使用二分检索法搜索指定的整形数组中是否有指定的值 key,如果存在,则返回该值第一次出现的地方的下标(以 0 为开始),如果不存在,则返回一个负整数。
static int binarySearch(int[] a, int fromIndex, int toIndex, int key) - 使用二分检索法搜索指定的整形数组中指定的区间是狗有指定的值 key,参数 fromIndex 为搜索区间的起始下标,toIndex 为结束下标,检索区间包括 fromIndex 指明的元素而不包括 toIndex 指明的元素,起点为负值与终点超出最大下标值均会造成运行时报错。如果存在,则返回该值出现的地方在整个数组的下标,如果不存在,则返回一个负整数。值得注意的是,如果搜索的 key 值在该数组中多次出现,并且指定的区间内没有包括所有等于该值的元素,即使存在部分,但是还是会返回负值;如果指定的区间内包括了所有的等于该值的元素,则会返回第一个元素在整个数组中的下标。
static int[] copyOf(int[] original, int newLength) - 复制指定的数组,从头截取原数组或使用 0 填充尾部,使新的数组长度为 newLength。其他类型的数组用法相同。(byte, double, float, long, short 用 0 填充,boolean 用 false 填充,char 用 null 字符填充,T 用 null 填充)
static int[] copyOfRange(int[] original, int from, int to) - 复制指定范围的数组,参数 from 为复制的起点,to 为赋值的终点,但是复制的范围和二分检索一样只包括起点不包括终点。参数 from 为负数运行时会报错,参数 to 超过原数组最大下标时用 0 填充,其他类型的数组用对应的值填充。
static boolean equals(int[] a, int[] a2) - 比较两个数组是否相同,如果相同则返回 true,不同则返回 false。
static void fill(int[] a, int val) - 使数组 a 中所有元素替换为 val。
static void fill(int[] a, int fromIndex, int toIndex, int val) - 使数组 a 中指定的区间内所有元素替换为 val,替换区间包括起点而不包括终点,如果起点为负数或终点超出最大下标,则运行时会报错。
static void sort(int[] a) - 对指定的数组按升序进行排序。boolean 型数组不可排序,自定义类型数组则按定义的比较器产生的顺序,函数原型为 static void sort(T[] a, Comparator<? super T> c)
static void sort(int[] a, int fromIndex, int toIndex) - 对指定数组的指定区间按升序进行排序,区间包括起点不包括终点,起点为负数或终点超出最大下标值运行时会报错,自定义类型数组则按定义的比较器产生的顺序,函数原型为 static void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)
static void parallelSort(int[] a) - Java 8 新增的并行排序算法,功能和用法和上述相同,数据显示,在对大量数据的排序时,并行排序算法 parallelSort 效率要高于上文经过调优的快速排序算法 sort。(https://sanaulla.info/2013/04/08/arrays-sort-versus-arrays-parallelsort/)
static void parallelSort(int[] a, int fromIndex, int toIndex) - 同上。
static String toString(int[] a) - 以字符串表示形式返回指定数组的内容。
示例代码:
import java.util.Arrays;
public class ArraysDemo
{
private static int a[] = {28, 70, 12, 99, 1, 70, 53};
private static int b[] = {70, 12, 99, 1, 70, 53, 28};
private static int c[];
private static int d[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
public static void main(String args[])
{
System.out.println(Arrays.binarySearch(a, 99));
System.out.println(Arrays.binarySearch(a, 1, 5, 70));
c = Arrays.copyOf(a, 10);
System.out.println(Arrays.toString(c));
c = Arrays.copyOfRange(a, 1, 3);
System.out.println(Arrays.toString(c));
System.out.println(Arrays.equals(a,b));
Arrays.fill(b, 100);
System.out.println(Arrays.toString(b));
Arrays.fill(b,1,5,50);
System.out.println(Arrays.toString(b));
Arrays.sort(a);
System.out.println(Arrays.toString(a));
Arrays.sort(d, 3, 7);
System.out.println(Arrays.toString(d));
}
}
结果:
部分结果解释:
a[] = {28, 70, 12, 99, 1, 70, 53}
Arrays.binarySearch(a, 1, 5, 70) 得到的结果为 -4,即检索失败。
该函数的目的是从 a[1] 到 a[4] 中(检索区间不包括指定的终点,即 a[5])检索值为 70 的元素,由上文中的说明,当数组中存在多个值等于 70 的元素时,如果检索的区间没有包括所有值等于 70 的元素,即使区间中存在部分值为 70 的元素,结果也是检索失败,函数依然返回负值。