1、Arrays的静态方法
Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组(static修饰的方法可以直接通过类名调用),具体如下表所示。
静态方法 | 解释 |
---|---|
int binarySearch(type[] a,type key) | 使用二分法查询key元素值在a数组中出现的索引。若a数组中不包含key元素,则返回负数。调用该方法前提:要求数组中元素已按升序排列。 |
int binarySearch(type[] a,int formIndex,int toIndex,type key) | 与上面的方法类似,但它只搜索a数组中formIndex到toIndex索引的元素。调用该方法前提:要求数组中元素已按升序排列。 |
type[] copyOf(type[] original,int length) | 这个方法将会把original数组复制成一个新数组,其中length是新数组的长度。若length小于original数组的长度,则新数组就是原数组前面length个元素;反之,则为原数组后面补0(数值类型)、false(布尔类型)或者null(引用类型)。 |
type[] copyOfRange(type[] original,int from,int to) | 该方法与上面的方法类似,但仅复制original数组的from索引到to索引的元素。 |
Boolean equals(type[] a,type[] a2) | 若数组a和数组a2的长度相等,并且数组元素也一一相同,则返回true。 |
void fill(type[] a,type val) | 将数组a所有元素赋值为val。 |
void fill(type[] a,int formIndex,int toIndex,type val) | 与上面的方法类似,将数组a的formIndex到toIndex索引的的元素赋值为val。 |
void sort(type[] a) | 对数组a的数组元素进行排序 |
void sort(type[] a,int formIndex,int toIndex) | 仅对数组a的formIndex到toIndex索引的的元素进行排序 |
String toString(type[] a) | 该方法是将数组转换成一个字符串。该方法按顺序把多个数组元素连缀在一起,元素之间用英文逗号和空格隔开。 |
下面为代码演示。
public class ArraysTest {
public static void main(String[] args) {
int[] a = {3, 7, 6, 1, 2};
int[] b = {3, 7, 6, 1, 2};
System.out.println("数组a和数组b是否相同" + Arrays.equals(a, b));
int[] c = Arrays.copyOf(a, 6);
System.out.println("数组a和数组c是否相同" + Arrays.equals(a, c));
System.out.println("数组c的元素为:" + Arrays.toString(c));
//将数组c的第三个元素(包括)到第五个元素(不包括)赋值为1
Arrays.fill(c, 2, 4, 1);
System.out.println("数组c的元素为:" + Arrays.toString(c));
Arrays.sort(c);
System.out.println("数组c的元素为:" + Arrays.toString(c));
}
}
结果如下所示。
2、Java 8增强的Arrays
Java8中增强了Arrays类的功能,为Arrays类增加了一些工具方法,这些工具方法可以充分利用多CPU并行的能力来提高设值、排序的性能。
由于计算机硬件的飞速发展,目前几乎所有的家用PC都是4核、8核的CPU,而服务器的CPU则具有更好的性能,因此Java 8与时俱进地增加了并发支持,这样便可以充分利用硬件设备来提高程序的运行性能。
方法 | 解释 |
---|---|
void parallelPrefix(xxx[] array,XxxBinaryOperator op) | 该方法使用op参数指定的计算公式计算得到的结果作为新的元素。op计算公式包括left、right两个形参,其中left代表数组中请一个索引处的元素,right代表数组中当前索引处的元素,当计算第一个新数组元素时,left的值默认为1。 |
void parallelPrefix(xxx[] array,int formIndex,int toIndex,type key,XxxBinaryOperator op) | 与上一个方法类似,区别为仅重新计算formIndex到toIndex索引的元素。 |
void setAll(xxx[] array,IntToXxxFuncton generator) | 该方法使用指定的生成器(generator)为所有数组元素设置值,该生成器控制数组元素的值的生成算法。 |
void parallelSetAll(xxx[] array,IntToXxxFuncton generator) | 该方法与上一个方法功能相同,仅增加了并行能力,可以利用多CPU并行来提高性能。 |
void parallelSort(xxx[] array) | 该方法与之前的sort方法功能相同,仅增加了并行能力, |
void parallelSort(xxx[] array,int formIndex,int toIndex) | 与上一个方法类似,区别为仅对formIndex到toIndex索引的元素进行排序。 |
Spliterator.OfXxx spliterator(xxx[] array) | 将该数组的所有元素转换成对应的Spliterator对象。 |
Spliterator.OfXxx spliterator(xxx[] array,int startInclusive,int endInclusive) | 与上一个方法类似,,, |
XxxStream stream(xxx[] array) | 该方法将数组转换为Stream,Stream是Java 8中新增流式编程的API。 |
XxxStream stream(xxx[] array,int startInclusive,int endInclusive) | 与上一个方法类似,,, |
public class ArraysTest2 {
public static void main(String[] args) {
int[] a = {3, -4, 25, 16, 30, 18};
//对数组进行并发排序
Arrays.parallelSort(a);
System.out.println(Arrays.toString(a));
int[] b = {3, -4, 25, 16, 30, 18};
Arrays.parallelPrefix(b, new IntBinaryOperator() {
@Override
public int applyAsInt(int left, int right) {
return left * right;
}
});
System.out.println(Arrays.toString(b));
int[] c = new int[5];
Arrays.parallelSetAll(c, new IntUnaryOperator() {
@Override
public int applyAsInt(int operand) {
return operand;//operand代表正在计算的元素索引
}
});
System.out.println(Arrays.toString(c));
}
}
运算结果如下:
说明:该程序中Arrays.parallelPrefix(b, IntBinaryOperator op)计算方法为:
1*3=3;3*-4=-12;-12*25=-300;-300*16=-4800;-4800*30=-144000;-144000*18=-2592000