【考古】Java8 集合工具类Arrays

news2025/1/17 3:40:47

在这里插入图片描述

文章目录

  • 一、概述
  • 二、常用方法
  • 三、简单使用
    • 3.1 Arrays的sort排序
    • 3.2 Arrays的binarySearch查找
    • 3.3 Arrays的fill填充
    • 3.4 Arrays的copyOf复制数组
    • 3.5 Arrays的copyOfRange复制部分
    • Arrays的asList数组转链表
  • 四、总结

一、概述

  在 Java 的util包中提供了一个Arrays工具类用来操作数组的,它提供了许多的静态方法,主要包含了操纵数组的各种方法,例如数组所有元素进行排序,按从小到大的顺序、查找元素等。使用时导包import java.util.Arrays,并使用Arrays.方法()进行调用方法。

二、常用方法

方法说明
asList将数组转换为一个固定的List链表对象
binarySearch在数组中查找元素。
若找到,则返回此值的下标,若没找到,返回 -1;
copyOf拷贝数组。
第一个参数是原数组,第二个参数是拷贝长度,返回值是将原数组拷贝一份返回
copyOfRange
deepEquals
deepHashCode
deepToString(Object[][] arrays)返回多维数组的字符串形式
equals比较两个数组内容是否相等。
fill(Object[] array,Object object)为数组元素填充相同的值
fill(Object[] array,int from,int to,Object object)对数组的部分元素填充一个值,从起始位置到结束位置,取头不取尾
parallelPrefix
parallelSetAll
parallelSort
setAll
sort()
sort(Object[] array)
对数组元素指定范围进行排序,默认升序。
对字符串进行排序时,是对每一个字符比较,而不是简单的比较长度
sort(Object[] array, int from, int to)对数组元素指定范围进行排序(排序范围是从元素下标为from,到下标为to-1的元素进行排序)
spliterator
stream

三、简单使用

3.1 Arrays的sort排序

  在以前学数组的时候,要对数组进行排序就需要定义一个排序的方法,就比较麻烦,在Arrays工具类的静态方法中提供了 sort 方法,主要是对基本类型的数组所有元素进行排序,按从小到大的顺序。在可以对原数组元素顺序进行改变时,可以使用这些现成的排序工具方法,如下所示。

// 对int型数组进行排序,会改变原数组中的元素位置
public static void sort(int[] a){...}
// 对数组fromIndex下标(包含)到toIndex下标(不包含)的元素进行排序,同样会改变原数组的元素
public static void sort(int[] a, int fromIndex, int toIndex){...}
// long型数组的排序
public static void sort(long[] a){...}
public static void sort(long[] a, int fromIndex, int toIndex){...}
// short型数组的排序
public static void sort(short[] a){...}
public static void sort(short[] a, int fromIndex, int toIndex){...}
// char型数组的排序
public static void sort(char[] a){...}
public static void sort(char[] a, int fromIndex, int toIndex){...}
// byte型数组的排序
public static void sort(byte[] a){...}
public static void sort(byte[] a, int fromIndex, int toIndex){...}
// float型数组的排序
public static void sort(float[] a){...}
public static void sort(float[] a, int fromIndex, int toIndex){...}
// double型数组的排序
public static void sort(double[] a){...}
public static void sort(double[] a, int fromIndex, int toIndex){...}

示例如下所示:

@Test
public void test() {
    int arr[] = {10, 7, 9, 2, 6, 1};
    System.out.println("数组排序前元素有:");
    for (int a : arr) {
        System.out.print(a + "\t");
    }
    System.out.println("\n数组排序后元素有:");
    Arrays.sort(arr);
    for (int a : arr) {
        System.out.print(a + "\t");
    }
}

运行的结果如下所示:

数组排序前元素有:
10	7	9	2	6	1	
数组排序后元素有:
1	2	6	7	9	10	

从上面代码中,不需要定义一个排序的方法,直接使用Arrays工具类中sort静态方法减少了代码的书写量,方法操作。

3.2 Arrays的binarySearch查找

  在程序开发中,经常会使用数组查找需要的元素,如果数组的元素比较多查找某一个元素就比较麻烦,在Arrsys工具类提供了静态的binarySearch方法,它的作用是通过二分法在已经排好序的数组中查找指定的元素,并返回该元素的下标,找不到指定元素时返回下标值小于0,如下所示。

// int排序数组中的二分查找
public static int binarySearch(int[] a, int key){...}
// 对int数组fromIndex下标数组fromIndex下标(包含)到toIndex下标(不包含)的元素的二分查找
public static int binarySearch(int[] a, int fromIndex, int toIndex, int key){...}
// short排序数组中的二分查找
public static int binarySearch(short[] a, short key){...}
public static int binarySearch(short[] a, int fromIndex, int toIndex, short key){...}
// char排序数组中的二分查找
public static int binarySearch(char[] a, char key){...}
public static int binarySearch(char[] a, int fromIndex, int toIndex, char key){...}
// byte排序数组中的二分查找
public static int binarySearch(byte[] a, byte key){...}
public static int binarySearch(byte[] a, int fromIndex, int toIndex, byte key){...}
// double排序数组中的二分查找
public static int binarySearch(double[] a, double key){...}
public static int binarySearch(double[] a, int fromIndex, int toIndex, double key){...}
// float排序数组中的二分查找
public static int binarySearch(float[] a, float key){...}
public static int binarySearch(float[] a, int fromIndex, int toIndex, float key){...}

示例如下所示:

@Test
public void test() {
    int arr[] = {10, 7, 9, 2, 6, 1};
    // 数组排序方法
    Arrays.sort(arr);
    System.out.println("数组排序后元素有:");
    // 使用foreach循环遍历数组的所有元素
    for (int a : arr) {
        System.out.print(a + "\t");
    }
    // 查找指定元素6,返回它的索引值
    int index = Arrays.binarySearch(arr, 6);
    System.out.println("\n数组排序后元素6的索引值是:" + index);
}

运行的结果如下所示:

数组排序后元素有:
1	2	6	7	9	10	
数组排序后元素6的索引值是:2

3.3 Arrays的fill填充

  在程序开发中,经常会使用数组若给数组填充值时,在Arrays数组中提供了 fill 方法是对数组部分的元素填充一个值,从开始位置到结束位置,取左边不取右边
  在初始化一个数组之后,如果没有给数组的元素赋值,那么这个数组中的元素默认是为0的,那么我们一个个进行赋值又会略显麻烦,会堆积代码!所以我们就需要用到fill方法进行填充,但是这么做会让全部元素变成同一个数值!

@Test
public void test() {
    //这里创建一个名称为 myList 的数组,数组的元素个个数为5
    int[] myList = new int[5];
    //为数组填充3,格式为fill(列表,数值)
    Arrays.fill(myList, 3);
    for (int x : myList) {
        System.out.print(x + "\t");
    }
}

运行的结果如下所示:

3	3	3	3	3

  在给元素赋值完或者是填充完元素之后,如果想对某个元素进行修改,那么我们就要重新赋值或者是替换元素,但是重新赋值会增加代码,让代码显得更繁琐,所以Arrays类中提供了替换元素的方法fill!

@Test
public void test() {
    int arr[] = {10, 7, 9, 2, 6, 1};
    System.out.println("数组元素有:");
    for (int a : arr) {
        System.out.print(a + "\t");
    }
    // 给数组下标的1到4元素的赋值为5
    Arrays.fill(arr, 1, 4, 5);
    System.out.println("\n数组元素有:");
    for (int a : arr) {
        System.out.print(a + "\t");
    }
}

运行的结果如下图所示:

数组元素有:
10	7	9	2	6	1	
数组元素有:
10	5	5	5	6	1

3.4 Arrays的copyOf复制数组

  在Java程序的使用过程中,有时候会需要一个含有相同或者是部分相同元素的数组,但是重新创建数组的话就会增加代码长度,减少代码可读性,那么我们就可以使用到复制数组或者是部分数组的方法!copyOf方法提供了多种重载的方法,用以复制数组,增加代码可读性。该方法不受数组长度的限制,若超出,则多处部分为0!

public static boolean[] copyOf(boolean[] original, int newLength);
public static byte[] copyOf(byte[] original, int newLength);
public static char[] copyOf(char[] original, int newLength);
public static double[] copyOf(double[] original, int newLength);
public static float[] copyOf(float[] original, int newLength);
public static int[] copyOf(int[] original, int newLength);
public static long[] copyOf(long[] original, int newLength);
public static short[] copyOf(short[] original, int newLength);
public static <T> T[] copyOf(T[] original, int newLength);

示例如下所示:

@Test
public void test() {
    int[] myList = {1, 2, 3, 4};
    int[] justList = Arrays.copyOf(myList, 4);
    for (int x : justList) {
        System.out.println(x);
    }
    System.out.println(myList);
    System.out.println(justList);
}

运行的结果如下图所示:

1
2
3
4
[I@45fe3ee3
[I@4cdf35a9

从以上结果可以看出赋值成功了,并且内存空间不同

3.5 Arrays的copyOfRange复制部分

  有时候在编辑代码的时候只需要中间一部分代码,但是copyOf方法只能复制以前面部分为开头的元素,而不能直接复制中间的代码,为了解决这一个问题,这个类提供了另一个方法copyOfRange方法(中文意思:选择复制)利用这个方法就可以解决这一个问题!

public static boolean[] copyOf(boolean[] original, int newLength);
public static byte[] copyOf(byte[] original, int newLength);
public static char[] copyOf(char[] original, int newLength);
public static double[] copyOf(double[] original, int newLength);
public static float[] copyOf(float[] original, int newLength);
public static int[] copyOf(int[] original, int newLength);
public static long[] copyOf(long[] original, int newLength);
public static short[] copyOf(short[] original, int newLength);
public static <T> T[] copyOf(T[] original, int newLength);

示例如下所示:

@Test
public void test() {
    int[] myList = {1, 2, 3, 4};
    int[] justList = Arrays.copyOfRange(myList, 1, 3);
    // Arrays类的方法使用形式Arrays.copyOfRange(列表,第一个索引位置,第二个索引位置)
    for (int x : justList) {
        System.out.println(x);
    }
}

运行的结果如下图所示:

2
3

Arrays的asList数组转链表

  将数组转换成链表形式返回,返回的是内部类ArrayList。对于这个链表,更改操作只有set,而且会改变原来的数组内容;另外就是不支持add操作,对于add调用,会抛出 UnsupportedOperationException 异常(没有重写add实现时的默认实现)。

 public static <T> List<T> asList(T... a){...}

四、总结

  本文主要介绍了Arrays工具类的导包,举了一些常用方法示例。这些方法通过案例实现帮助理解,希望大家通过本文的学习,对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解Redis-实战篇-分布式锁

深入了解Redis-实战篇-分布式锁 一、故事背景二、知识点主要构成1、分布式锁基本原理2、不同实现方式对比3、基于redis的分布式锁3.1、获取锁3.2、释放锁 4、Redisson的可重入锁原理5、Redisson的锁重试和WatchDog机制 三、总结提升 一、故事背景 最近在系统的回顾redis相关的…

系列3-常见的高可用MySQL解决方案

高可用主要解决两个问题&#xff0c;如何实现数据共享和同步数据、如何处理failover&#xff0c;数据共享的解决方案一般是SAN&#xff0c;数据同步通过rsync和drbd技术来实现。 1、主从复制解决方案 这是MySQL自身的高可用解决方案&#xff0c;数据同步方法采用的是MySQL rep…

Eclipse进行debug

目录 基本步骤三种执行方式 -- 键盘快捷键variables面板移除debug过的项目通过eclipse调用具有软件界面的项目进行debug各个variable颜色具有的意义 基本步骤 点击eclipse右上角debug按钮 调出debug面板 点击小蜘蛛图标&#xff08;不是点绿色三角的Run&#xff09; 此时会进…

FPGA实现NIC 100G UDP协议栈网卡,UltraScale+ 100G Ethernet Subsystem驱动,提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、本25G/100G网卡基本性能简介4、详细设计方案接口概述PCIe HIPDMA IFAXI总线接口时钟同步处理TXQ和RXQ队列TXCQ和RXCQ队列完成EQ MAC PHYUltraScale 100G Ethernet Subsystem流水线队列管理发送调度程序端口和接口数据路径以及发送和接收…

怎么把图片变成表格?几个步骤轻松转换

如果您需要将一张图片中的数据转换成表格&#xff0c;这里有几个简单的步骤&#xff0c;可以帮助您完成这个转换过程。以下是需要注意的事项。 首先&#xff0c;我们先了解OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。然后合理运用…

前端vue uni-app自定义精美海报生成组件

在当前技术飞速发展的时代&#xff0c;软件开发的复杂度也在不断提高。传统的开发方式往往将一个系统做成整块应用&#xff0c;一个小的改动或者一个小功能的增加都可能引起整体逻辑的修改&#xff0c;从而造成牵一发而动全身的情况。为了解决这个问题&#xff0c;组件化开发逐…

【《快速构建AI应用——AWS无服务器AI应用实战》——基于云的解决方案快速完成人工智能项目的指南】

基于云的人工智能服务可以自动完成客户服务、数据分析和财务报告等领域的各种劳动密集型任务。其秘诀在于运用预先构建的工具&#xff0c;例如用于图像分析的Amazon Rekognition或用于自然语言处理的AWS Comprehend。这样&#xff0c;就无须创建昂贵的定制软件系统。 《快速构…

如何用DHTMLX组件为Web应用创建甘特图?(二)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一&#xff0c;DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…

Git在VSCode中的使用

1.Git图像化界面进行项目初始化&#xff08;git init&#xff09; 2. Git图形化界面对文件进行操作 当我们创建一个文件时&#xff0c;该文件后面有一个U&#xff0c;表示文件未跟踪。 我们在管理工具中输入日志并提交代码&#xff0c;相当于做了两件事&#xff0c;将文件由“…

ABB机器人RAPID编程常用指令介绍2

ABB机器人RAPID编程常用指令介绍2 1. 程序运行停止指令 Break 应用:机器人在当前指令行立刻停止运行,程序运行指针指向下一行指令,可以用start键继续运行机器人 举例: … Break; … 与stop指令的区别可以参考下面的示意图: 2. 程序运行停止指令 Exit 应用:机器人在当前指…

分享 一个类似 ps 辅助线功能

效果图片&#xff1a; 提示&#xff1a;这里的样式我做边做了修改&#xff0c;根据个人情况而定。 //你也可以npm下载 $ npm install --save vue-ruler-tool特点 没有依赖可拖动的辅助线快捷键支持 开始使用 1. even.js /*** description 绑定事件 on(element, event, han…

django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …

Linux常用命令——dpkg-deb命令

在线Linux命令查询工具 dpkg-deb Debian Linux下的软件包管理工具 补充说明 dpkg-deb命令是Debian Linux下的软件包管理工具&#xff0c;它可以对软件包执行打包和解包操作以及提供软件包信息。 语法 dpkg-deb(选项)(参数)选项 -c&#xff1a;显示软件包中的文件列表&am…

【ASP.NET MVC】数据到客户端(7)

前文ViewBag数据在服务端动态生成页面&#xff0c;也可以传到客户端浏览器供JS使用。 一、数据从控制器到客户端 前文介绍&#xff0c;动态生成页面时&#xff0c;控制器的数据 并没有传递到 客户端&#xff0c;而是给自己来用&#xff0c;生成View 再利用http传递到客户端浏…

rn打包react-native-orientation报错

rn 打包时控制台报Task :react-native-orientation:verifyReleaseResources FAILED 解决&#xff1a;修改node_modules下react-native-orientation依赖中的build.gradle文件

拓数派入选中国信通院“铸基计划”「高质量数字化转型产品及服务全景图」...

7月27日&#xff0c;由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;主办的“2023数字生态发展大会”暨中国信通院“铸基计划”年中会议在京召开&#xff0c;本次大会深度展示了中国信通院在数字化领域的工作成果&#xff0c;并正式发布了《高质量数字化转…

FineReport SQL查询分页

参考&#xff1a;https://help.fanruan.com/finereport/doc-view-4795.html 参考示例为填报页面&#xff0c;以下为分页预览模式下SQL查询分页的制作。 参数说明&#xff1a; 模版参数&#xff1a;gPageSize每页显示数量、gPageNo当前页数 数据集结果&#xff1a;totalcnt总数…

S形速度曲线轨迹规划(SMART PLC梯形图源代码)

有关S形速度曲线轨迹规划相关内容,可以查看下面相关文章,这里不再赘述公式推导过程。 S速度曲线轨迹规划问题(普通变频位置闭环控制算法介绍+SCL代码)_RXXW_Dor的博客-CSDN博客位置控制用PD控制器,详细内容介绍请查看下面博客文章:PD控制器算法详细解读_RXXW_Dor的博客-CS…

宠物医疗进化:互联网宠物医院开发改变兽医服务方式

随着互联网的飞速发展&#xff0c;各行各业都在积极探索数字化转型的可能性。而宠物医疗行业也不例外。互联网宠物医院的开发将为宠物主人和兽医带来许多好处。下面我们将介绍一些互联网宠物医院开发的好处。   提供便利的服务&#xff1a;互联网宠物医院的开发将使宠物主人能…

C# Blazor 学习笔记(5):blazor文件夹组件引入

文章目录 前言文件夹组件引入文件夹分类文件引入解决方法 前言 为了更好的组件化管理整个文件&#xff0c;我选择使用分文件夹对项目组件进行分类。 文件夹组件引入 文件夹分类 Shared&#xff1a;Layout布局空间放置地方&#xff0c;由于默认创建&#xff0c;动也不好动&a…