java.util.Arrays 快速学习教程
在 Java 中,java.util.Arrays
类提供的多种数组操作功能,可以有效地执行各种数组相关的操作,使得数组处理变得简单和高效。
打印数组
String[] arr = new String[] {"a", "b", "c", "d"};
System.out.println(Arrays.toString(arr)); // 输出 [a, b, c, d]
Arrays.toString(arr)
,不过是简单的一个调用,却让你的数组输出从一串地址,变成了清晰可辨的字符。
复制数组
要复制一个新的数组么?copyOf
和 copyOfRange
给你全方位的选择:
String[] arr = new String[] {"a", "b", "c", "d"};
String[] copyOf2 = Arrays.copyOf(arr, 2); // [a, b]
System.out.println(Arrays.toString(copyOf2));
String[] copyOfRange = Arrays.copyOfRange(arr, 1, 3); // [b, c]
System.out.println(Arrays.toString(copyOfRange));
String[] copyOf10 = Arrays.copyOf(arr, 10); // [a, b, c, d, null, null, null, null, null, null]
System.out.println(Arrays.toString(copyOf10));
这 copyOf
,copyOfRange
,无异于为数组之尺,想要复制前 N 个元素,使用 copyOf
,想要取其中一段,使用 copyOfRange
。
注意:若范围大于原数组,多出位置以 null 填充。
填充数组
String[] arr = new String[5];
Arrays.fill(arr, "java");
System.out.println(Arrays.toString(arr)); // [java, java, java, java, java]
如若数组空空如也,可用 Arrays.fill(arr, "str")
将它填满。每一个元素,都被赋予相同的值。
也可以使用 Arrays.setAll
填充,它允许传入一个函数,生成填充值。
// 生成 100以内的 随机数
IntFunction<Integer> intFunction = i -> new Random().nextInt(100);
Integer[] intArr = new Integer[5];
Arrays.setAll(intArr, intFunction);
System.out.println(Arrays.toString(intArr));
// output:[29, 17, 18, 11, 85]
数组比较
数据比较有两种方式,一是使用 Arrays.equals
,二是使用 Arrays.hashCode
。
Arrays.equals
String[] arr = new String[] {"a", "b", "c", "d"};
Object[] arr1 = new Object[] {arr, new String[] {"a", "b", "c", "d"}};
Object[] arr2 = new Object[] {arr, arr};
System.out.println(Arrays.equals(arr1, arr2)); // false
System.out.println(Arrays.deepEquals(arr1, arr2)); // tue
如果是一维数组比较,直接 Arrays.equals
比较没有问题。如果是多维数组,Arrays.equals
并不会比较子数组中的元素值,此时需要使用deepEquals
比较。
Arrays.hashCode
String[] arr = new String[] {"a", "b", "c", "d"};
Object[] arr2 = new Object[] {arr, arr};
System.out.println(Arrays.hashCode(arr2));
System.out.println(Arrays.deepHashCode(arr2));
arr[0] = null;
System.out.println(Arrays.hashCode(arr2));
System.out.println(Arrays.deepHashCode(arr2));
元素可能会变,如何捕捉这一瞬间的改变?hashCode()
,deepHashCode()
,便是这捕风捉影的法宝。hashCode
方法会根据数组元素值计算出一个数字,如果元素值发生改变,则数字改变。但是同样对于多维数字,在计算数字时不会计算子数组中的元素,这种情况应该使用 deepHashCode
判断。
输出:
-2117384671
125140001
-2117384671
32668737
数组排序
// 生成 100以内的 随机数
IntFunction<Integer> intFunction = i -> new Random().nextInt(100);
Integer[] intArr = new Integer[5];
Arrays.setAll(intArr, intFunction);
System.out.println(Arrays.toString(intArr));
// output: [18, 31, 86, 59, 43]
Arrays.sort(intArr);
System.out.println(Arrays.toString(intArr));
// output: [18, 31, 43, 59, 86]
Arrays.sort
方法可以将元素排序。而 parallelSort()
可以并发排序,但是在数据量比较小的情况下,Arrays.sort
可能效率更高。
二分查找
二分搜索可以快速找到数组中的指定元素的利器。
Integer[] intArr = new Integer[] {2, 3, 4, 5, 6, 7, 8, 9};
int index = Arrays.binarySearch(intArr, 3);
System.out.println("index:"+index);
System.out.println(intArr[index]);
注意事项:使用
binarySearch()
前确保数组是排序过的,否则结果将不可预知。
数组转 Stream
Java 8 引入的 Stream API 让数组操作更加现代化,可以链式操作。使用 Arrays.stream
可以让数组共享这一便利。
Integer[] intArr = new Integer[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.stream(intArr).count()); // 10
ToIntFunction toIntFunction = i -> (int)i;
System.out.println(Arrays.stream(intArr).mapToInt(toIntFunction).sum());// 45
数组转换
如果你想把数组转成 List 怎么办?Arrays.asList()
就是你需要的。
String[] arr = new String[] {"a", "b", "c", "d"};
List<String> list = Arrays.asList(arr);
System.out.println(list); // 输出 [a, b, c, d]
// list.add("e"); 报错
注意事项:asList()
返回的列表不支持增删操作,它和原始数组是共享数据的。
并行前缀计算
使用 parallelPrefix
函数并行地累积给定数组中的每个元素。对于大型数组,并行前缀计算通常比顺序循环更有效。
示例:每一个元素转换成当前以及之前所有元素的和。
Integer[] intArr = new Integer[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Arrays.parallelPrefix(intArr, (left, right) -> left + right);
System.out.println(Arrays.toString(intArr));
输出:[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
总结
文章介绍了Java中java.util.Arrays
类提供的多种数组操作功能,展示了其强大且多样的用途。可以有效地执行各种数组相关的操作,使得数组处理变得简单和高效。
本文 Github.com/niumoo/JavaNotes仓库已经收录。
本文原发于网站:Java Arrays 教程
本文原发于公众号:程序猿阿朗
java.util.Arrays 快速学习教程的更多相关文章
- 【Java线程池快速学习教程】
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- Java线程池快速学习教程
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- 【Java的JNI快速学习教程】
1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时 ...
- Java 数组基础,java.util.Arrays
定义数组 方式1(推荐,更能表明数组类型) 方式2(同C语言) 方式3定义时直接初始化 数组运用基础 数组长度 equals() 数组元素不为基本数据类型时 二维数组 二维数组基础 变长的二维数组 j ...
- JDK1.8源码(四)——java.util.Arrays 类
java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 1.asList public static ...
- 要想数组用的 6,怎能不懂 java.util.Arrays
java.util.Arrays 类就是为数组而生的专用工具类,基本上常见的对数组的操作,Arrays 类都考虑到了,这让我由衷地觉得,是时候给该类的作者 Josh Bloch.Neal Gafter ...
- 【转】java.util.Arrays.asList 的用法
DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...
- [Java] java.util.Arrays 中使用的 sort 采用的算法 (转)
http://book.douban.com/annotation/15154366/Q: java.util.Arrays 中使用的 sort 采用的是什么算法? A: java中Arrays. ...
- java.util.Arrays的使用
在Java.util包中有一个工具类Arrays类,封装了一些操作数组的方法.简单使用如下: package com.arrays.test; import java.util.Arrays; pub ...
- 源码(09) -- java.util.Arrays
java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...
随机推荐
- ElasticSearch实战指南必知必会:安装分词器、高级查询、打分机制
ElasticSearch实战指南必知必会:安装中文分词器.ES-Python使用.高级查询实现位置坐标搜索以及打分机制 1.ElasticSearch之-安装中文分词器 elasticsearch ...
- 8.1 Windows驱动开发:内核文件读写系列函数
在应用层下的文件操作只需要调用微软应用层下的API函数及C库标准函数即可,而如果在内核中读写文件则应用层的API显然是无法被使用的,内核层需要使用内核专有API,某些应用层下的API只需要增加Zw开头 ...
- Linux下的gcc/g++编译器的使用 [补档-2023-06-13]
gcc编译器 这东西是Linux上的c/c++编译器. 5-1 gcc的工作流程 5-2 gcc的常用参数 -v 查看gcc版本号, --version也可以 -E 生成预处理文件 -S 生成汇编 ...
- Celery Worker log 中记录 task_id
import inspect import logging import threading from logging import Logger as Logger, LogRecord from ...
- 纪念JDBC
技术总是在不断更新变化的,尤其是在IT编程领域. 有时候我们理所当然的用着现成的框架,以至于用的太过于顺手,更要时不时的骂一句: 什么垃圾框架?我家狗都不会用! 如果那些被拍死在沙滩的"前浪 ...
- Flink CDC引起的Mysql元数据锁
记一次Flink CDC引起的Mysql元数据锁事故,总结经验教训.后续在编写Flink CDC任务时,要处理好异常,避免产生长时间的元数据锁.同时出现生产问题时要及时排查,不能抱有侥幸心理. 1.事 ...
- TP5图片处理常见问题
一.Class 'think\Image' not found composer require topthink/think-image 装上了扩展控制器头部加了 use think\Image然后 ...
- 一份55页Java性能调优PPT分享
提起"肖桦"这个人,相信很多小伙伴对他比较陌生.除去现任唯品会资深技术专家头衔外,他更为技术圈所熟知的是他的著名开源项目:SpringSide. SpringSide是以sprin ...
- Java编程思想第四版(完整中文高清版)pdf
这是一本有独到.深入的见解的Java语言,以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概念.本书共22章,包括操作符.控制执行流程.访问权限控制.复用类.多态.接口.通过异常处理错误.字符串.泛 ...
- The Network Adapter could not establish the connection errorCode 17002, state 08006
问题说明 今天在centos7虚拟机中运行java程序,程序启动需要连接主机的oracle,报错: The Network Adapter could not establish the connec ...