创建数组


Arrays创建数组的主要方式有以下三种:

  • copyOf:复制指定的数组,截取或使用 null 填充
  • copyOfRange:复制指定范围内的数组到一个新的数组
  • fill:对数组进行填充

copyOf

复制 length 位的数组

public static void main(String[] args) {  
    String[] intro = new String[]{"复", "制", "测", "试"};  
    String[] revised = Arrays.copyOf(intro, 3);  
    String[] expanded = Arrays.copyOf(intro, 5);  
    System.out.println(Arrays.toString(revised));  
    System.out.println(Arrays.toString(expanded));  
}

输出结果如下:

[复, 制, 测]
[复, 制, 测, 试, null]

copyOfRange

复制指定区间的数组

示例程序:

String[] intro = new String[] {"Java", "is", "a", "programming", "language"};  
String[] abridgement = Arrays.copyOfRange(intro, 0, 3);  
String[] abridgementExpanded = Arrays.copyOfRange(intro, 0, 6);  
System.out.println(Arrays.toString(abridgement));  
System.out.println(Arrays.toString(abridgementExpanded));

输出结果:

[Java, is, a]
[Java, is, a, programming, language, null]

fill

使用指定字符串,填充数组

示例程序:

String[] stutter = new String[4];  
Arrays.fill(stutter, "filled");  
System.out.println(Arrays.toString(stutter));

输出结果:

[filled, filled, filled, filled]

比较数组


Arrays的比较主要使用的是 equal() 方法

String[] intro = new String[] {"Java", "is", "a", "programming", "language"};  
boolean result = Arrays.equals(new String[]{"Java", "is", "a", "programming", "language"}, intro);  
System.out.println(result);  
boolean result1 = Arrays.equals(new String[]{"Java", "is", "a", "programming", "languages"}, intro);  
System.out.println(result1);

数组排序


String[] intro1 = new String[] {"Java", "is", "a", "programming", "language"};  
String[] sorted = Arrays.copyOf(intro1, 4);  
Arrays.sort(sorted);  
System.out.println(Arrays.toString(sorted));

输出结果:

[Java, a, is, programming]

数组检索

使用 BinarySearch 可以对数组进行检索,并且支持模糊和精确搜索

String[] intro1 = new String[]{"Java", "is", "a", "programming", "language"};  
String[] sorted = Arrays.copyOf(intro1, 4);  
Arrays.sort(sorted);  
int exact = Arrays.binarySearch(sorted, "Java");  
System.out.println(exact);  
int caseInsensitive = Arrays.binarySearch(sorted, "programming", String::compareToIgnoreCase);  
System.out.println(caseInsensitive);

数组转流


流的英文单词是 Stream,类似于IO流这些,将集合作为一个流进行操作,比如: 统计数量求和比较大小

String[] intro = new String[] {"I", "am", "a", "student"};
System.out.println(Arrays.stream(intro).count()); // output: 4
System.out.println(Arrays.stream(intro, 1, 2).count()); // 指定开始下标和结束下标 output: 1

打印数组


默认的 System.out.println() 只能打印带有toString() 方法的对象,不然默认打印的是对象的地址值:

[Ljava.lang.String;@3d075dc0

Arrays封装了方法,可以实现快捷打印:

String[] intro = new String[] {"I", "am", "a", "student"};  
System.out.println(Arrays.toString(intro)); // [I, am, a, student]  
int[] numbers = new int[] {1, 2, 3, 4, 5};  
System.out.println(Arrays.toString(numbers)); // [1, 2, 3, 4, 5]

数组转List


String[] intro = new String[] {"I", "am", "a", "student"};  
List<String> rets = Arrays.asList(intro);  
System.out.println(rets);

setall


Java 8 新增了 setAll() 方法,它提供了一个函数式编程的入口,可以对数组的元素进行填充:

int[] array = new int[10];  
Arrays.setAll(array, i -> i*10);  
System.out.println(Arrays.toString(array)); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

i 就相当于是数组的下标,值从 0 开始,到 9 结束,那么 i * 10 就意味着值从 0 * 10 开始,到 9 * 10 结束

parallelPrefix


parallelPrefix() 方法和 setAll() 方法一样,也是 Java 8 之后提供的,提供了一个函数式编程的入口,通过遍历数组中的元素,将当前下标位置上的元素与它之前下标的元素进行操作,然后将操作后的结果覆盖当前下标位置上的元素。

int[] arr = new int[] {1, 2, 3, 4};
Arrays.parallelPrefix(arr, (left, right) -> left + right);
System.out.println(Arrays.toString(arr));

上面代码中有一个 Lambda 表达式((left, right) -> left + right),是什么意思呢?上面这段代码等同于:

int[] arr = new int[]{1, 2, 3, 4};
Arrays.parallelPrefix(arr, (left, right) -> {
    System.out.println(left + "," + right);
    return left + right;
});
System.out.println(Arrays.toString(arr));

来看一下输出结果就明白了:

1,2
3,3
6,4
[1, 3, 6, 10]

也就是说, Lambda 表达式执行了三次:

  • 第一次是 1 和 2 相加,结果是 3,替换下标为 1 的位置
  • 第二次是 3 和 3 相加,结果是 6,也就是第一次的结果和下标为 2 的元素相加的结果
  • 第三次是 6 和 4 相加,结果是 10,也就是第二次的结果和下标为 3 的元素相加的结果