常用工具类-Arrays
- 数组打印
- 创建数组
- 比较数组
- 数组排序和检索
- 数组转List
- setAll 和 parallelSetAll
数组打印
Arrays提供了toString()方法,可以直接将数组的内容打印出来,极为便捷。
String[] strArr = new String[] {"1","2","3"};
System.out.println(strArr); // 直接打印的话,输出的是对象的地址 [Ljava.lang.String;@4eec7777
System.out.println(Arrays.toString(strArr)); // [1, 2, 3]
创建数组
创建数组一共有三种方法:
- copyOf() 将指定的数组拷贝指定的元素个数到一个新的数组中
- copyOfRange() 将指定的数组从指定的索引开始拷贝指定的元素个数到新数组
- fill() 将指定的数据填充的指定的数组中
String[] names = new String[]{"一","颗","大","西","瓜"};
// public static <T> T[] copyOf(T[] original, int newLength) 指定拷贝的源数组和数组的长度
String[] copy1 = Arrays.copyOf(names,3);
String[] copy2 = Arrays.copyOf(names,6);
// 打印输出
System.out.println(Arrays.toString(copy1));// [一, 颗, 大]
System.out.println(Arrays.toString(copy2));// [一, 颗, 大, 西, 瓜, null]
// public static <T> T[] copyOfRange(T[] original, int from, int to)
String[] copy3 = Arrays.copyOfRange(names,0,3); // 从索引0开始拷贝,然后拷贝三个元素
String[] copy4 = Arrays.copyOfRange(names,1,5); // 从索引1开始拷贝,然后拷贝5个元素
System.out.println(Arrays.toString(copy3)); // [一, 颗, 大]
System.out.println(Arrays.toString(copy4)); // [颗, 大, 西, 瓜]
// fill 填充,将数组列表填充为同一个元素
// public static void fill(Object[] a, Object val)
String[] tempArr = new String[4];
Arrays.fill(tempArr,"小");
System.out.println(Arrays.toString(tempArr));// [小, 小, 小, 小]
比较数组
数组直接的比较,使用的是equals()方法
如果两个数组的元素个数顺序内容都相等,则会返回true,否则返回false.
String[] fruits = new String[]{"橘子","西瓜","草莓"};
boolean rs1 = Arrays.equals(new String[]{"橘子","草莓","西瓜"},fruits);
System.out.println(rs1); // false
boolean rs2 = Arrays.equals(new String[]{"橘子","哈密瓜","西瓜"},fruits);
System.out.println(rs2); // false
boolean rs3 = Arrays.equals(new String[]{"橘子","西瓜","草莓"},fruits);
System.out.println(rs3); // true
数组排序和检索
数组排序通过sort()方法进行排序,检索的话,Arrays提供了二分查找binarySearch()。
只有先通过Arrays.sort()进行排序之后,才能通过Arrays.binarySearch()进行查找,如果没有排序就去二分查找,则会找不到。
// 1.排序
String[] sortArr = new String[]{"zhangsan","lisi","wangwu"};
Arrays.sort(sortArr);
System.out.println(Arrays.toString(sortArr)); // [lisi, wangwu, zhangsan]
// 2.检索
int index1 = Arrays.binarySearch(sortArr, "abc");
int index2 = Arrays.binarySearch(sortArr, "zhangsan");
System.out.println(index1); // -1 表示没有找到
System.out.println(index2); // 2 找到了,在数组的索引为2的位置
数组转List
尽管数组非常强大,但它自身可以操作的工具方法很少,比如说判断数组中是否包含某个值。如果能转成 List 的话,就简便多了,集合框架中封装许多灵活简便的方法。
Arrays.asList()即可将数组转换为集合。
源码:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
这里需要注意的是,asList()方法返回的是 java.util.Arrays.ArrayList 这个ArrayList ( 它的长度是固定的,无法进行元素的删除或者添加)并不是我们集合框架中的那个ArrayList,集合框架中的ArrayList是 java.util.ArrayList , 所以当我们想获得集合中的ArrayList时,强转一下。
String[] strArr = new String[] {"1","2","3"};
List<String> list = Arrays.asList(strArr);
System.out.println(list);// [1, 2, 3]
setAll 和 parallelSetAll
setAll()方法 对数组元素进行填充
setAll 源码:
public static <T> void setAll(T[] array, IntFunction<? extends T> generator) {
Objects.requireNonNull(generator);
for (int i = 0; i < array.length; i++)
array[i] = generator.apply(i);
}
示例:setAll 的使用
int[] numbers = new int[10];
// 每个元素 = 元素索引 * 10
Arrays.setAll(numbers,(i)->{
return i *=10;
});
// 上面代码更为简单的写法 Arrays.setAll(numbers,i->i*10);
System.out.println(Arrays.toString(numbers)); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
parallelPrefix() 方法,提供了一个函数式编程的入口,通过遍历数组中的元素,将当前下标位置上的元素与它之前下标的元素进行操作,然后将操作后的结果覆盖当前下标位置上的元素。
parallelSetAll 源码:
public static <T> void parallelSetAll(T[] array, IntFunction<? extends T> generator) {
Objects.requireNonNull(generator);
IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.apply(i); });
}
示例:parallelSetAll的使用,将数组中的每个元素值变为前一个元素和后一个的和。
int[] arr = new int[]{1,2,3,4};
Arrays.parallelPrefix(arr,((left, right) -> {
return left + right;
}));
// Arrays.parallelPrefix(arr,(left,right)->left+right);
System.out.println(Arrays.toString(arr));