常用工具类-Arrays

news2024/11/25 18:25:25

常用工具类-Arrays

  • 数组打印
  • 创建数组
  • 比较数组
  • 数组排序和检索
  • 数组转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));

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

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

相关文章

16.docker删除redis缓存数据、redis常用基本命令

1.进入redis容器内部 &#xff08;1&#xff09;筛选过滤出redis容器 docker ps | grep "redis"&#xff08;2&#xff09;进入redis容器 #说明&#xff1a;d24为redis容器iddocker exec -it d24 /bin/bash2.登陆redis (1) 进入redis命令行界面 redis-cli说明&a…

go消息队列RabbitMQ - 订阅模式-direct

1.发布订阅 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下&#xff1a; 队列与交换机的绑定&#xff0c;不能…

javaEE - 21( 15000字 Tomcat 和 HTTP 协议入门 -2)

一&#xff1a; HTTP 响应 1.1 认识 “状态码” (status code) 状态码表示访问一个页面的结果. (是访问成功, 还是失败, 还是其他的一些情况…)&#xff0c;以下为常见的状态码. 1.1.1 200 OK 这是一个最常见的状态码, 表示访问成功. 抓包抓到的大部分结果都是 200 HTTP/…

004集—二调数据库标注分子分母模式及统计净面积——arcgis

二调数据库中分子分母标注方法为&#xff1a; 表达式如下&#xff1a; "<und>"& [TBBH] &"</und>" &vbnewline& [DLBM] "<und>"&[DLBM]&"</und>" &vbnewline& [DLMC] &quo…

Anaconda的安装及其配置

一、简介 Anaconda是一个开源的包、环境管理器&#xff0c;主要具有以下功能和特点&#xff1a; 提供conda包管理工具&#xff1a;可以方便地创建、管理和分享Python环境&#xff0c;用户可以根据自己的需要创建不同的环境&#xff0c;每个环境都可以拥有自己的Python版本、库…

【零基础入门TypeScript】Union

目录 语法&#xff1a;Union文字 示例&#xff1a;Union类型变量 示例&#xff1a;Union 类型和函数参数 Union类型和数组 示例&#xff1a;Union类型和数组 TypeScript 1.4 使程序能够组合一种或两种类型。Union类型是表达可以是多种类型之一的值的强大方法。使用管道符号…

【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 状态压缩 广度优先搜索 LeetCode1494. 并行课程 II 给你一个整数 n 表示某所大学里课程的数目&#xff0c;编号为 1 到 n &#xff0c;数组 relations 中&#xff0c; relations[i] [xi, yi] 表示一个先修课的关系&am…

关于在大模型中遇到的6(colab)

来源&#xff1a;免费的GPU——colab使用教程 - 知乎 作者&#xff1a;焦龙 首先你得注册一个google账号才能用google的这些东西&#xff0c;然后你需要科学上网才能去注册google账号&#xff0c;这些我就不说了。 colab网址&#xff1a;运行代码的地方 https://colab.rese…

Hack The Box-Challenges-Misc-M0rsarchive

解压压缩包&#xff0c;里面是一张图片和一个新的zip文件 图片放大后的图案是----. 考虑到为莫斯密码&#xff0c;将其解密 密码为9&#xff0c;继续解压缩包 又是一张莫斯密码图加压缩包&#xff0c;写一段脚本去解密图片中的莫斯密码&#xff0c;并自动解压缩包 import re i…

cesium-测量高度垂直距离

cesium做垂直测量 完整代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-i…

情人节送什么礼物合适?情人节礼物最佳排行榜

​马上就要到情人节了&#xff0c;大家是否已经选好了送给爱人的礼物呢&#xff1f;如果没有&#xff0c;或许可以考虑一些优质的数码产品。随着科技的发展&#xff0c;数码产品已经成为我们生活中不可或缺的一部分。接下来&#xff0c;我将为大家推荐几款非常适合作为情人节礼…

LeetCode:2.两数相加

目录 题目&#xff1a;​编辑2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 分析问题&#xff1a; 官方的优秀代码博主的注释&#xff1a; 博主的辣眼代码&#xff0c;无注释&#xff0c;拉出来拷打自己&#xff1a; 每日表情包&#xff1a; 2. 两数相加 - 力扣&am…

什么是信创业态支持?支持信创的数据库防水坝哪家好?

随着国产化信创化的崛起&#xff0c;出现了很多新名词&#xff0c;例如信创业态支持、国产信创化等等。今天我们就来聊聊什么是信创业态支持&#xff1f;支持信创的数据库防水坝哪家好&#xff1f; 什么是信创业态支持&#xff1f; 大范围而言&#xff0c;信创业态支持可以理解…

【404App】一篇文章搞定SSL证书更换,赶紧收藏吧!

场景:阿里云服务器,nginx 第一步:下载免费证书,登录购买域名的阿里云账户,选择免费证书申请、下载(https://yundun.console.aliyun.com/?spm=5176.12818093_-1363046575.ProductAndResource–ali–widget-product-recent.2.3be916d0qj5Z8O&p=cas#/certExtend/free/…

uniapp中配置开发环境和生产环境

uniapp在开发的时候&#xff0c;可以配置多种环境&#xff0c;用于自动切换IP地址&#xff0c;用HBuilder X直接运行的就是开发环境&#xff0c;用HBuilder X发布出来的&#xff0c;就是生产环境。 1.使用HBuilder X创建原生的uniapp程序 选择vue3 2.什么都不改&#xff0c;就…

ChatGPT辅助编程,一次有益的尝试

如果大家想学习PCIe&#xff0c;搜索网上的信息&#xff0c;大概率会看到chinaaet上Felix的PCIe扫盲系列的博文 Felix-PCIe扫盲 每次看这个系列博文的时候&#xff0c;我都在想有没有什么方法可以把这个系列的博文都保存到一个pdf文件中&#xff0c;这样方便阅读。于是有了下…

嵌入式 - UART Flow Control

简介 / Introduction UART 流量控制是一种让慢速和快速设备通过 UART 相互通信而不会丢失数据的方法。 考虑两个设备通过 UART 通信的情况。发送器 T 正在向接收器 R 发送一长串字节。R 是一个比 T 慢的设备&#xff0c;在某些时候 R 无法跟上。它需要对数据进行一些处理或清空…

项目02《游戏-07-开发》Unity3D

基于 项目02《游戏-06-开发》Unity3D &#xff0c; 接下来做UI框架的逻辑系统&#xff0c;管理器和UI背包&#xff0c; 首先闯将UI框架的两个重要脚本 BasePanel.cs 和 UIManager.cs &#xff0c; 双击BasePanel.cs脚本修改代码&#xff1a; using UnityEngine; pu…

基于Java SSM框架实现网上租车系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现网上租车系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多商家的之中&#xff0c;随之就产生了“网上租车系统”&#xff0c;这样就让网上租车系统更加方便简单。 对于本网上…

架构篇33:传统的可扩展架构模式-分层架构和SOA

文章目录 分层架构SOA小结相比于高性能、高可用架构模式在最近几十年的迅猛发展来说,可扩展架构模式的发展可以说是步履蹒跚,最近几年火热的微服务模式算是可扩展模式发展历史中为数不多的亮点,但这也导致了现在谈可扩展的时候必谈微服务,甚至微服务架构都成了架构设计的银…