Java中Arrays数组工具类的使用全解
本文几乎涵盖了所有的Arrays工具类(基于Java 11)的方法以及使用用例,一站式带你了解Arrays类的用法,希望对大家有帮助。
码字不易,三连支持一下吧
Arrays数组工具类
方法一览表
| 方法名 | 简要描述 |
|---|---|
| asList() | 返回由指定数组支持的固定大小的列表。 |
| sort() | 将数组排序(升序) |
| parallelSort() | 将指定的数组按升序排序 |
| binarySearch() | 使用二分搜索法快速查找指定的值(前提是数组必须是有序的) |
| compare() | 按字典顺序比较两个数组 |
| compareUnsigned() | 按字典顺序比较两个数组,将数字元素处理为无符号 |
| copyOf() | 填充复制数组 |
| copyOfRange() | 将数组的指定范围复制到新数组 |
| equals() | 比较两个数组 |
| deepEquals() | 比较两个数组深度 |
| toString() | 将数组转换为字符串 |
| deepToString() | 将一个多维数组转换为字符串 |
| fill() | 将指定元素填充给数组每一个元素 |
| mismatch() | 查找并返回两个数组之间第一个不匹配的索引,如果未找到则返回-1 |
| parallelPrefix() | 使用提供的函数对数组元素进行操作 |
| parallelSetAll() | 使用提供的生成器函数并行设置指定数组的所有元素以计算每个元素 |
| setAll() | 使用提供的生成器函数设置指定数组的所有元素以计算每个元素 |
快速定位详细操作
接下来我用代码一一举例演示。
asList()
功能:返回由指定数组支持的固定大小的列表
参数:asList(T… a)
返回值:一个列表
代码示例:
@Test
public void asListTest() {
List<String> ss = Arrays.asList("hello", "world");
// List<String> ss1 = Arrays.asList("hello", "world",1); 报错,类型必须一直(泛型)
System.out.println(ss); //[hello, world]
// ss.add("java"); //UnsupportedOperationException 会报错
// ss.remove(1); //UnsupportedOperationException 会报错
System.out.println(ss.get(0)); //hello
ss.set(0, "java");
System.out.println(ss); //[java, world]
}
注意
将这一数组转换为列表后,对应的列表是不支持添加和删除操作的,否则会报错
但可以修改和获取元素
toString() 和 deepToString()
功能:将数组转换为字符串
参数:待转化数组
返回值:转化后的字符串
代码示例:
@Test
public void toStringTest() {
String[] str = {"java", "hello", "javascript"};
String[][] strs = {{"a", "b"}, {"c"}, {"d", "e"}};
System.out.println(Arrays.toString(str));
//[java, hello, javascript]
System.out.println(Arrays.toString(strs));
//[[Ljava.lang.String;@4563e9ab, [Ljava.lang.String;@11531931, [Ljava.lang.String;@5e025e70]
//普通的toString()方法只转化一层,内层还是地址值
System.out.println(Arrays.deepToString(strs));
//可以深度转换
//[[a, b], [c], [d, e]]
}
sort() 和 parallelSort()
功能:都是将数组排序(默认升序,支持lambda,泛型)
参数:
- sort(Object[] a[, int fromIndex, int toIndex])
- 或者sort(T[] a[, int fromIndex, int toIndex,] Comparator<? super T> c)
- parallelSort(Object[] a[, int fromIndex, int toIndex])
- 或者parallelSort(T[] a[, int fromIndex, int toIndex,] Comparator<?
super T> c)
返回值:无
代码示例:
@Test
public void sortTest() {
String[] str = {"abc", "add", "java", "hello", "javascript"};
int[] ii = {1, 8, 99, 222, 35};
System.out.println(Arrays.toString(str));
System.out.println(Arrays.toString(ii));
//单参数情况
//Arrays.sort(str); 默认全排,字母会按照字母表顺序
//Arrays.sort(ii);
//System.out.println(Arrays.toString(str)); //[abc, add, hello, java, javascript]
//System.out.println(Arrays.toString(ii)); //[1, 8, 35, 99, 222]
//多参数情况
//Arrays.sort(str,2,4); 只排列指定范围内的
//Arrays.sort(ii,2,4);
//System.out.println(Arrays.toString(str)); //[abc, add, hello, java, javascript]
//System.out.println(Arrays.toString(ii)); //[1, 8, 99, 222, 35]
//可传入lambda表达式(多参数情况可指定开始结束位置)
// Arrays.sort(str, (a, b) -> b.compareTo(a)); //降序
// System.out.println(Arrays.toString(str)); //[javascript, java, hello, add, abc]
//parallelSort()方法目前我实验感觉与sort()相差无几,基本相似
Arrays.parallelSort(str);
System.out.println(Arrays.toString(str)); //[abc, add, hello, java, javascript]
Arrays.parallelSort(str,(a,b)->b.compareTo(a));
System.out.println(Arrays.toString(str)); //[javascript, java, hello, add, abc]
}
binarySearch()
功能:使用二分搜索法快速查找指定的值(前提是数组必须是有序的,支持lambda表达式,泛型)
参数:binarySearch(Object[] a[, int fromIndex, int toIndex], Object key)
返回值:有则返回对应下标,无则返回负值
代码示例:
@Test
public void binarySearchTest() {
int[] a = {1, 5, 7, 4, 6, 7, 8, 4, 9, 0};
Arrays.sort(a); //必须先排序
System.out.println(Arrays.toString(a));
//[0, 1, 4, 4, 5, 6, 7, 7, 8, 9]
System.out.println(Arrays.binarySearch(a, 4)); //2
System.out.println(Arrays.binarySearch(a, 11)); //-11
//也可指定范围查找,其查找机制是折半查找,每次缩小一半范围
}
compare() 和 compareUnsigned()
功能:按字典顺序比较两个数组
参数:
- compare(T[] a, 【int aFromIndex, int aToIndex】, T[] b,【 int bFromIndex, int bToIndex】,【 Comparator<? super T> cmp】)
返回值:
- 如果第一个和第二个数组相等并且包含相同顺序的相同元素,则值为0 ;
- 如果第一个数组按字典顺序小于第二个数组,则值小于0 ;
- 如果第一个数组按字典顺序大于第二个数组,则值大于0
代码示例:
@Test
public void compareTest() {
int[] a = {1, 2, 3, 4};
int[] b = {1, 2, 3, 4, 5};
int[] c = {1, 2, 3, 4, 5};
String[] s1 = {"java","hello","c++"};
String[] s2 = {"java","hello"};
// System.out.println(Arrays.compare(a,b)); //-1
// System.out.println(Arrays.compare(b,a)); //1
// System.out.println(Arrays.compare(b,c)); //0
System.out.println(Arrays.compare(s1,s2)); //1
//也可划定范围去比较,或者传入lambda
// System.out.println(Arrays.compareUnsigned(s1,s2));//报错
System.out.println(Arrays.compareUnsigned(a,b)); //-1
}
注意
compareUnsigned()只能比较byte(),short(),int(),long()数字型数组,可以划定比较范围,但不支持lambda
copyOf() 和 copyOfRange()
功能:复制填充数组
参数:
- copyOf(int[] original, int newLength)…
- copyOf(T[] original, int newLength)
- copyOfRange(int[] original, int from, int to)…
- copyOfRange(T[] original, int from, int to)
- copyOfRange(U[] original, int from, int to, 类<? extends T[]> newType)
返回值:复制填充后的数组
代码示例:
@Test
public void copyOfTest() {
//copyOf
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int[] arr1 = Arrays.copyOf(arr, 5); //拷贝长度为5,第二个参数为新数组的长度
int[] arr2 = Arrays.copyOf(arr, 15);
System.out.println(Arrays.toString(arr1)); //[1, 2, 3, 4, 5]
System.out.println(Arrays.toString(arr2)); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0]
arr[0] = 20; //改变原数组
System.out.println(Arrays.toString(arr)); //原数组改变
System.out.println(Arrays.toString(arr1)); //复制后的数组不变
String[] str = {"java","hello","world"};
String[] str1 = Arrays.copyOf(str,2);
String[] str2 = Arrays.copyOf(str,5);
System.out.println(Arrays.toString(str1)); //[java, hello]
System.out.println(Arrays.toString(str2)); //[java, hello, world, null, null]
//copyOfRange()
int[] arrs = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int[] arr3 = Arrays.copyOfRange(arrs,2,8); //[3, 4, 5, 6, 7, 8]
int[] arr4 = Arrays.copyOfRange(arrs,5,15); //[6, 7, 8, 9, 0, 0, 0, 0, 0, 0]
System.out.println(Arrays.toString(arr3));
System.out.println(Arrays.toString(arr4));
arrs[6] = 99; //改变原数组
System.out.println(Arrays.toString(arrs)); //[1, 2, 3, 4, 5, 6, 99, 8, 9, 0] 原数组改变
System.out.println(Arrays.toString(arr3)); //[3, 4, 5, 6, 7, 8] 复制后的不会随着改变
}
注意
copyOf()是从原数组0位置开始拷贝指定长度到新数组
copyOfRange()是从原数组中指定范围拷贝到新数组
如果指定长度或者范围超出原数组范围,则超出部分会补上此数据类型的默认值,如String类型会补null,int型会补0
equals()
功能:比较两个数组
参数:
- equals(int[] a,【 int aFromIndex, int aToIndex】, int[] b,【 int bFromIndex, int bToIndex】)…
- equals(T[] a, 【int aFromIndex, int aToIndex】, T[] b,【 int bFromIndex, int bToIndex】, Comparator<? super T> cmp)
返回值:boolean
代码示例:
@Test
public void equalsTest() {
int[] a = {1, 2, 3, 4, 5, 6};
int[] b = {6, 5, 3, 4, 2, 1};
System.out.println(Arrays.equals(a, b)); //false
System.out.println(Arrays.equals(a, 2, 3, b, 2, 3)); //指定比较范围 true
}
deepEquals()
功能:比较两个数组的深度
参数:deepEquals(Object[] a1, Object[] a2)
返回值:boolean
代码示例:
@Test
public void deepEqualsTest() {
String[] s1 = {"java", "hello", "c++"};
String[] s2 = {"java", "hello"};
String[] s3 = {"java", "hello", "c++"};
System.out.println(Arrays.deepEquals(s1, s2)); //false
System.out.println(Arrays.deepEquals(s1, s3)); //true
String[][] s4 = {{"hello"}, {"java"}, {"c++"}, {"python"}};
String[][] s5 = {{"hello"}, {"java"}, {"c++"}, {"python"}};
System.out.println(Arrays.deepEquals(s4, s5)); //true
System.out.println(Arrays.equals(s4, s5)); //false
int[] a = {1,2};
int[] b = {1,2};
// System.out.println(Arrays.deepEquals(a,b)); //报错
}
比较equals()和deepEquals()方法
相同点
- 两者都是比较数组是否相等的方法
不同点
- equals默认从头比较到尾,也可以指定范围,但是deepEquals不能指定范围
- deepEquals可以比较多维数组,equals不能
- deepEquals不支持比较基本类型数组,equals支持
fill()
功能:将指定元素填充给数组每一个元素
参数:fill(int[] a, 【int fromIndex, int toIndex】, int val)
返回值:无
代码示例:
@Test
public void fillTest() {
String[] a = {"a", "b", "c", "d", "e", "f"};
System.out.println(Arrays.toString(a)); //[a, b, c, d, e, f]
Arrays.fill(a, "java");
System.out.println(Arrays.toString(a)); //[java, java, java, java, java, java]
String[] b = {"a", "b", "c", "d", "e", "f"};
System.out.println(Arrays.toString(b)); //[a, b, c, d, e, f]
Arrays.fill(b, 2, 5, "java");
System.out.println(Arrays.toString(b)); //[a, b, java, java, java, f]
//默认全填充,也可以指定范围,会改变原数组
}
mismatch()
功能:查找并返回两个数组之间第一个不匹配的索引,如果未找到则返回-1
参数:
- mismatch(int[] a, 【int aFromIndex, int aToIndex】, int[] b,【 int bFromIndex, int bToIndex】)
- mismatch(T[] a, 【int aFromIndex, int aToIndex】, T[] b,【 int bFromIndex, int bToIndex】, Comparator<? super T> cmp)
返回值:两个数组之间第一个不匹配的索引,未找到不匹配则返回-1。
代码示例:
@Test
public void mismatchTest() {
String[] s1 = {"java", "c++", "html", "css", "Javascript", "world"};
String[] s2 = {"world", "c++", "html", "css", "Javascript"};
System.out.println(Arrays.mismatch(s1, s2)); //0
System.out.println(Arrays.mismatch(s1, 1, 4, s2, 1, 4)); //-1
System.out.println(Arrays.mismatch(s1, 1, 5, s2, 1, 4)); //3
}
parallelPrefix()
功能:使用提供的函数并行地累积给定数组的每个元素。
参数:
- parallelPrefix(int[] array, 【int fromIndex, int toIndex】, IntBinaryOperator op)
- parallelPrefix(T[] array, 【int fromIndex, int toIndex】, BinaryOperator op)
返回值:无
代码示例:
@Test
public void parallelPrefixTest() {
String[] s1 = {"java", "c++", "html", "css", "Javascript", "world"};
System.out.println(Arrays.toString(s1)); //[java, c++, html, css, Javascript, world]
Arrays.parallelPrefix(s1, String::concat);
System.out.println(Arrays.toString(s1)); //[java, javac++, javac++html, javac++htmlcss, javac++htmlcssJavascript, javac++htmlcssJavascriptworld]
int[] a = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 5]
Arrays.parallelPrefix(a, (x, y) -> x * y);
System.out.println(Arrays.toString(a)); //[1, 2, 6, 24, 120]
Arrays.parallelPrefix(a, 2, 4, (x, y) -> x / y);
System.out.println(Arrays.toString(a)); //[1, 2, 6, 0, 120] 也可指定范围
}
setAll() 和 parallelSetAll()
功能:使用提供的生成器函数设置指定数组的所有元素以计算每个元素。
参数:
- parallelSetAll(T[] array, IntFunction<? extends T> generator)
- setAll(T[] array, IntFunction<? extends T> generator)
返回值:无
代码示例:
@Test
public void setAllTest() {
int[] arr = {111, 222, 333, 444, 555};
Arrays.setAll(arr, (e) -> e + 5);
System.out.println(Arrays.toString(arr)); //[5, 6, 7, 8, 9]
String[] str = {"a", "b", "c"};
Arrays.setAll(str, new IntFunction<>() {
@Override
public String apply(int value) {
return value + "java";
}
});
System.out.println(Arrays.toString(str)); //[0java, 1java, 2java]
int[] arr1 = {111, 222, 333, 444, 555};
Arrays.parallelSetAll(arr1, new IntUnaryOperator() {
@Override
public int applyAsInt(int operand) {
return operand + 5;
}
});
System.out.println(Arrays.toString(arr1)); //[5, 6, 7, 8, 9]
String[] str1 = {"a", "b", "c"};
Arrays.parallelSetAll(str1, (m) -> m + "haha");
System.out.println(Arrays.toString(str1)); //[0haha, 1haha, 2haha]
//总结setAll和parallelSetAll差不多,且都支持lambda
//通过索引值去改变元素,改编后的值与索引有关
}
本文大致包含了所有的方法,除了Java 11之后新增的,或者我看漏的,文中如有错误,还请指出,大家一起进步!
Java中Arrays数组工具类的使用全解的更多相关文章
- JAVA中封装JSONUtils工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
- Java 中的并发工具类
Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...
- Java学习:数组工具类Arrays
数组工具类Arrays java.util.Arrays是一个与数组相关的工具类,里面提供了大量的静态方法,用来实现数组常见的操作. public static String toString(数组) ...
- java中常用的工具类(一)
我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...
- Java容器---Arrays & Collections工具类
1.Array & Arrays 与Collection & Collections区别 (1)Collection": 是一个接口,与其子类共同组成一个Collection ...
- Java中Arrays数组的定义与使用
初始化 Java中数组是固定长度,数组变量是个对象. NullPointerException 空指针异常. ArrayIndexOutOfBoundsException 索引值越界. 数组三种初始化 ...
- java中常用的工具类(三)
继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类 ...
- java中常用的工具类(二)
下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 在JAVA中封装JSONUtil工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
随机推荐
- .net core在linux下图片中文乱码
不得不吐槽一下,.net core 2.2的System.Drawing在linux有很多坑,又是依赖libgdiplus,又是依赖gdiplus,依赖解决了又来了个中文乱码,怎的一声哀叹 这里做个笔 ...
- websocket在线测试工具
为了测试websocket, 根据网上的一些工具修改了一些, 因此得到了这个工具 源码 源码: <!DOCTYPE html> <html lang="en"&g ...
- sqlsugar freesql hisql 三个ORM框架性能测试对比
hisql与目前比较流行的ORM框架性能测试对比 总体测试结果 插入记录数 hisql(耗时) sqlsugar(耗时) freesql(耗时) 5条 0.0107秒 0.0312秒 0.02675秒 ...
- nginxWebUI
nginx网页配置工具 github: https://github.com/cym1102/nginxWebUI 功能说明 本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, ...
- [vscode] os.getcwd(),调试和命令行运行的结果不一致
问题描述: 调试和命令行运行的时候工作目录不一致 这会导致一个问题,我想从上级目录导入模块的话,F5调试就会找不到模块,而命令行则没问题 那么我该如何调试呢? 目录结构: top └ folder_ ...
- Zabbix监控报警Lack of free swap space on Zabbix server解决办法
故障描述: Lack of free swap space on Zabbix server 故障原因: 情况一:云主机:因为Zabbix监控没有考虑虚拟主机的swap分区情况. 情况二:物理主机:说 ...
- js 动态设置键值对数组 ,类似于 java 的Map 类型
1.前言 我想设置一个数据 var json = {a1 :1 , a2 :2 , a3 :3 .....} 这样的动态数据 ,怎么写呢? 2.正确写法 var json = []; for ...
- spring boot & maven 多模块 ---心得
1.前言 有个名字叫 多模块企业级项目 ,其实就是一个父级maven工程里面有着多个子级maven工程的项目 ,甚至在子级maven 里面还有多个子级maven, 这用到了 maven多模块开发的使 ...
- CentOS6.5-Hadoop2.7.3安装hive-2.1.1
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627723801960382979/ 系统版本,Hadoop已安装完成 Mysql安装完成 准备的解压包 安装zi ...
- rockchip-rk3399 RGA的使用
RGA的使用 RGA即二维图像辅助计算单元,该单元可以在极短时间内拷贝.旋转.格式转换.缩放.混合图片. rk官方RGA库链接:https://github.com/rockchip-linux/li ...
