常用工具类-Arrays

简介: 本文介绍了Java工具类Arrays和Arrays.ArrayList的常用功能,包括数组的打印、创建、比较、排序、检索以及转换为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]

创建数组

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

  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));
相关文章
|
存储 自然语言处理 Java
ResourceBundle.getBundle()来读取自定义的properties配置文件
ResourceBundle.getBundle()来读取自定义的properties配置文件
540 1
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
264473 0
|
JSON 搜索推荐 C++
vscode如何更改背景颜色主题,黑色或白色?
【11月更文挑战第16天】在 VS Code 中更改背景颜色主题,可通过三种方式实现:1) 使用快捷键 Ctrl+K 和 Ctrl+T(Mac 上为 Command+K 和 Command+T)选择主题;2) 通过菜单中的“管理”-&gt;“颜色主题”选项选择;3) 修改 settings.json 文件中的 &quot;workbench.colorTheme&quot; 属性。此外,用户还可从扩展市场安装更多主题以满足个性化需求。
25687 6
|
Java Maven Spring
如何在idea中创建Springboot项目? 手把手带你创建Springboot项目,稳!
文章详细介绍了在IDEA中创建Spring Boot项目的过程,包括选择Spring Initializr、配置项目属性、选择Spring Boot版本、导入依赖、等待依赖下载以及项目结构简介。
16488 1
|
存储 Java API
Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
|
XML 安全 Java
Spring高手之路20——深入理解@EnableAspectJAutoProxy的力量
本文详细探讨了Spring框架中的面向切面编程(AOP),特别是通过@EnableAspectJAutoProxy注解来启用和配置AOP的详细过程。从基本的AOP概念介绍到高级配置技巧,文章全面解析了如何在Spring应用中有效地使用AOP来增强代码的模块化和重用性。通过深入的代码示例和解释,本文不仅帮助初学者理解Spring AOP的基础,也使得经验丰富的开发者能够精通其高级特性和性能优化方法。
335 0
Spring高手之路20——深入理解@EnableAspectJAutoProxy的力量
|
存储 XML IDE
使用 Spring Boot 生成随机二维码:从浅入深的技术指南
【6月更文挑战第14天】在现代应用中,二维码已经成为了一个非常有用的工具。它们可以用来分享链接、存储信息、进行身份验证等等。本文将介绍如何在 Spring Boot 项目中生成随机二维码,并逐步深入该过程的技术细节。
422 2
|
安全 前端开发 Java
10:基于Servlet模拟用户登录功能的实现与解析-Java Web
10:基于Servlet模拟用户登录功能的实现与解析-Java Web
918 3
commons-collections常用工具类
commons-collections常用工具类
273 0
|
数据安全/隐私保护
matlab 曲线光滑,去毛刺,去离群值,数据滤波,高通滤波,低通滤波,带通滤波,带阻滤波
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度