常用工具类-Arrays

数组打印

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]

创建数组

创建数组一共有三种方法:

  1. copyOf() 将指定的数组拷贝指定的元素个数到一个新的数组中
  2. copyOfRange() 将指定的数组从指定的索引开始拷贝指定的元素个数到新数组
  3. 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);
}

image.png
这里需要注意的是,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));
  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀死一只知更鸟debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值