当前位置: 首页 > article >正文

Java Arrays工具类解析(Java 8-17)

一、Arrays工具类概述

java.util.Arrays是Java集合框架中提供的数组操作工具类,包含各种静态方法用于操作数组(排序、搜索、比较、填充、复制等)。自Java 8到17版本,Arrays类不断增强了功能,特别是引入了并行操作和Stream支持。

二、基础操作(Java 8+)

1. 数组打印

int[] numbers = {3, 1, 4, 1, 5, 9};
System.out.println(Arrays.toString(numbers)); 
// 输出: [3, 1, 4, 1, 5, 9]int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(matrix));
// 输出: [[1, 2], [3, 4]]

2. 数组比较

int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
System.out.println(Arrays.equals(arr1, arr2)); // trueString[][] strs1 = {{"A", "B"}, {"C"}};
String[][] strs2 = {{"A", "B"}, {"C"}};
System.out.println(Arrays.deepEquals(strs1, strs2)); // true

3. 数组填充

int[] nums = new int[5];
Arrays.fill(nums, 1);       // [1, 1, 1, 1, 1]
Arrays.fill(nums, 1, 3, 9); // [1, 9, 9, 1, 1] (范围左闭右开)

4. 数组复制

int[] original = {1, 2, 3, 4, 5};
int[] copy1 = Arrays.copyOf(original, 3);    // [1, 2, 3]
int[] copy2 = Arrays.copyOfRange(original, 1, 4); // [2, 3, 4]

三、排序与搜索(Java 8+)

1. 数组排序

int[] numbers = {3, 1, 4, 1, 5, 9};// 全数组排序
Arrays.sort(numbers); // [1, 1, 3, 4, 5, 9]// 范围排序
Arrays.sort(numbers, 1, 4); // [1, 1, 3, 4, 5, 9]// 并行排序(大数据量性能更好)
Arrays.parallelSort(numbers);

2. 自定义排序

String[] words = {"apple", "Banana", "cherry"};// 按字母顺序(区分大小写)
Arrays.sort(words); // ["Banana", "apple", "cherry"]// 不区分大小写排序
Arrays.sort(words, String.CASE_INSENSITIVE_ORDER); 
// ["apple", "Banana", "cherry"]// 使用Comparator
Arrays.sort(words, Comparator.comparing(String::length).reversed());
// ["Banana", "cherry", "apple"]

3. 二分查找

int[] sorted = {1, 3, 5, 7, 9};
int index = Arrays.binarySearch(sorted, 5); // 2
int notFound = Arrays.binarySearch(sorted, 6); // -4 (插入点为3,返回-3-1)

四、Java 8新增功能

1. Stream支持

int[] nums = {1, 2, 3, 4, 5};// 转换为IntStream
Arrays.stream(nums).filter(n -> n % 2 == 0).forEach(System.out::println); // 2, 4// 指定范围
Arrays.stream(nums, 1, 4).forEach(System.out::println); // 2, 3, 4

2. parallelPrefix(并行前缀计算)

int[] nums = {1, 2, 3, 4};
Arrays.parallelPrefix(nums, (a, b) -> a + b);
System.out.println(Arrays.toString(nums)); // [1, 3, 6, 10]

3. setAll与parallelSetAll

int[] squares = new int[5];
Arrays.setAll(squares, i -> i * i); // [0, 1, 4, 9, 16]// 并行版本
Arrays.parallelSetAll(squares, i -> i * i * i); // [0, 1, 8, 27, 64]

五、Java 9新增功能

1. equals比较增强

int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(Arrays.equals(a, 0, 2, b, 0, 2)); // true (比较范围)

2. mismatch方法

int[] a = {1, 2, 3, 4};
int[] b = {1, 2, 4, 4};
int index = Arrays.mismatch(a, b); // 2 (第一个不匹配的索引)

六、Java 11新增功能

1. compare和compareUnsigned

int[] a = {1, 2, 3};
int[] b = {1, 3, 2};
int result = Arrays.compare(a, b); // 负数(a < b)byte[] bytes1 = {(byte) 0xFF, 0x00};
byte[] bytes2 = {0x7F, 0x00};
int unsigned = Arrays.compareUnsigned(bytes1, bytes2); // 正数(无符号比较)

七、Java 17新增功能

1. arraySize计算

Object array = new int[10];
int size = Arrays.arraySize(array); // 10

2. arrayIndexScale

Object intArray = new int[10];
Object longArray = new long[10];
System.out.println(Arrays.arrayIndexScale(intArray)); // 4 (int占4字节)
System.out.println(Arrays.arrayIndexScale(longArray)); // 8 (long占8字节)

八、多维数组操作

1. 多维数组排序

int[][] matrix = {{3, 4}, {1, 2}, {5, 0}};// 按每行第一个元素排序
Arrays.sort(matrix, Comparator.comparingInt(a -> a[0]));
// [[1, 2], [3, 4], [5, 0]]// 按每行第二个元素排序
Arrays.sort(matrix, Comparator.comparingInt(a -> a[1]));
// [[5, 0], [1, 2], [3, 4]]

2. 不规则数组处理

String[][] irregular = {{"A", "B"}, {"C"}, {"D", "E", "F"}};// 深度操作依然有效
System.out.println(Arrays.deepToString(irregular));
// [[A, B], [C], [D, E, F]]

九、性能优化技巧

1. 选择合适的排序方法

// 小数组(<1万元素)
Arrays.sort(array);// 大数组(>1万元素)
Arrays.parallelSort(array);

2. 避免不必要的数组复制

// 不好的做法
int[] copy = Arrays.copyOf(original, original.length);
Arrays.sort(copy);// 好的做法(直接操作原数组)
Arrays.sort(original);

3. 使用setAll初始化大型数组

// 比循环更简洁高效
int[] largeArray = new int[100_000];
Arrays.setAll(largeArray, i -> i * 2);

十、高级应用案例

1. 自定义对象数组操作

class Person {String name;int age;// 构造方法/getter/setter省略
}Person[] people = {new Person("Alice", 25),new Person("Bob", 20),new Person("Charlie", 30)
};// 按年龄排序
Arrays.sort(people, Comparator.comparingInt(p -> p.age));// 使用Stream处理
Arrays.stream(people).filter(p -> p.age > 22).map(Person::getName).forEach(System.out::println);

2. 数组与集合转换

String[] names = {"Alice", "Bob", "Charlie"};// 数组转List(注意:返回的是不可变List)
List<String> list = Arrays.asList(names);// Java 8 Stream转换
List<String> mutableList = Arrays.stream(names).collect(Collectors.toList());// List转数组
String[] array = list.toArray(new String[0]);

3. 科学计算应用

double[] data = new double[10000];
Arrays.setAll(data, i -> Math.random());// 计算平均值
double avg = Arrays.stream(data).average().orElse(0);// 并行计算标准差
double mean = avg;
double variance = Arrays.stream(data).parallel().map(d -> Math.pow(d - mean, 2)).average().orElse(0);
double stdDev = Math.sqrt(variance);

十一、常见问题与解决方案

1. Arrays.asList()的陷阱

Integer[] intArray = {1, 2, 3};
List<Integer> list = Arrays.asList(intArray);// 以下操作会抛出UnsupportedOperationException
// list.add(4); 
// list.remove(0);// 解决方案:新建ArrayList
List<Integer> mutableList = new ArrayList<>(Arrays.asList(intArray));

2. 多维数组比较

int[][] a = {{1, 2}, {3, 4}};
int[][] b = {{1, 2}, {3, 4}};// 错误做法
System.out.println(Arrays.equals(a, b)); // false// 正确做法
System.out.println(Arrays.deepEquals(a, b)); // true

3. 并行操作注意事项

int[] data = new int[1000000];// 并行操作需要确保操作是无状态的
Arrays.parallelSetAll(data, i -> {// 不要使用外部变量,确保线程安全return i * i;
});

十二、版本特性总结

Java版本新增重要方法
8stream(), parallelSort(), parallelPrefix(), setAll()
9equals()范围比较, mismatch()
11compare(), compareUnsigned()
17arraySize(), arrayIndexScale()

通过掌握Arrays工具类的这些功能,您可以高效地处理各种数组操作,从简单的排序搜索到复杂的并行计算。根据不同的Java版本选择合适的方法,能够显著提升代码的简洁性和性能。

相关文章:

Java Arrays工具类解析(Java 8-17)

一、Arrays工具类概述 java.util.Arrays是Java集合框架中提供的数组操作工具类&#xff0c;包含各种静态方法用于操作数组&#xff08;排序、搜索、比较、填充、复制等&#xff09;。自Java 8到17版本&#xff0c;Arrays类不断增强了功能&#xff0c;特别是引入了并行操作和St…...

(19)VTK C++开发示例 --- 分隔文本读取器

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 本例采用坐标和法线&#xff08;x y z nx ny nz&#xff09;的纯文本文件&#xff0c;并将它们读入vtkPolyData并显示…...

Redis从入门到实战先导篇

前言&#xff1a;本节内容包括虚拟机VMware的安装&#xff0c;Linux系统的配置&#xff0c;FinalShell的下载与配置&#xff0c;Redis与其桌面客户端的安装指导,便于后续黑马Redis从入门到实战的课程学习 目录 主要内容 0.相关资源 1.VMware安装 2.Linux与CentOS安装 3.Fi…...

WebSocket是h5定义的,双向通信,节省资源,更好的及时通信

浏览器和服务器之间的通信更便利&#xff0c;比http的轮询等效率提高很多&#xff0c; WebSocket并不是权限的协议&#xff0c;而是利用http协议来建立连接 websocket必须由浏览器发起请求&#xff0c;协议是一个标准的http请求&#xff0c;格式如下 GET ws://example.com:3…...

uniapp中使用<cover-view>标签

文章背景&#xff1a; uniapp中遇到了原生组件(canvas)优先级过高覆盖vant组件 解决办法&#xff1a; 使用<cover-view>标签 踩坑&#xff1a; 我想实现的是一个vant组件库中动作面板的效果&#xff0c;能够从底部弹出框&#xff0c;让用户进行选择&#xff0c;我直…...

JavaScript 防抖和节流

方法一&#xff1a;使用lodash库的debounce方法 方法二&#xff1a;手写防抖函数 function debounce(fn,t){// 1.声明一个定时器变量 因为需要多次赋值 使用let声明let timer // 返回一个匿名函数return function(){if(timer){// 如果定时器存在清除之前的定时器 clearTimeout(…...

Spring Boot 启动时 `converting PropertySource ... to ...` 日志详解

Spring Boot 启动时 converting PropertySource ... to ... 日志详解 1. 日志背景 在 Spring Boot 应用启动过程中&#xff0c;会加载并处理多种 配置源&#xff08;如 application.properties、系统环境变量、命令行参数等&#xff09;。这些配置源会被封装为 PropertySource…...

分割数据集中.json格式标签转化成伪彩图图像

一、前言 图像分割任务中&#xff0c;分割数据集的转换和表示方式对于模型训练至关重要。目前主要有两种常见的分割结果表示方法&#xff1a; 1. 转化为TXT文件 这种方式通常使用一系列的点&#xff08;坐标&#xff09;来表示图像中每个像素的类别标签。每个点通常包含像素…...

Linux之彻底掌握防火墙-----安全管理详解

—— 小 峰 编 程 目录&#xff1a; 一、防火墙作用 二、防火墙分类 1、逻辑上划分&#xff1a;大体分为 主机防火墙 和 网络防火墙 2、物理上划分&#xff1a; 硬件防火墙 和 软件防火墙 三、硬件防火墙 四、软件防火墙 五、iptables 1、iptables的介绍 2、netfilter/…...

SwiftUI 常用控件简介

SwiftUI 是苹果公司推出的现代化声明式 UI 框架&#xff0c;用于构建 iOS、macOS、watchOS 和 tvOS 应用程序用户界面。以下是一些常用的 SwiftUI 控件&#xff1a; 1. 文本控件 Text: 显示一段文本。 2. 图像控件 Image: 显示图片&#xff0c;可以从系统图标、网络或本地资…...

HCIP-H12-821 核心知识梳理 (6)

ospf dr-priority命令默认值为1&#xff0c;取值范围为0~255.DHCPv6使用IPv6组播地址FF05::1:3用于中继代理和服务器之间的通信。VRF路由表里的OSPF外部路由允许被路由汇总&#xff08;asbr-summary)在IS-IS网络中&#xff0c;直连的两台路由器不管是P2P网络类型或是Broadcast网…...

Docker 安装配置教程(配置国内源)

## 一、Windows 安装 Docker Desktop 1. 系统要求: - Windows 10 64位:专业版、企业版或教育版 - 必须开启 Hyper-V 和容器功能 - 至少 4GB 内存 2. 安装步骤: - 访问 Docker 官网下载 Docker Desktop - 双击安装程序 - 按照向导完成安装 - 重启电脑 ## 二、macOS 安装 Dock…...

初识分布式事务原理

事务是指符合ACID特性的操作就是事务&#xff0c;在同一个数据库中&#xff0c;如果要分别对表A和表B进行插入和删除操作&#xff0c;如果其中一个操作执行失败&#xff0c;可以对当前数据库进行回滚&#xff0c;使其回滚到执行操作前的状态&#xff0c;但是现有的系统架构都是…...

# 构建和训练一个简单的CBOW词嵌入模型

构建和训练一个简单的CBOW词嵌入模型 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;词嵌入是一种将词汇映射到连续向量空间的技术&#xff0c;这些向量能够捕捉词汇之间的语义关系。在这篇文章中&#xff0c;我们将构建和训练一个简单的Continuous Bag of Words…...

Qt本地化-检测系统语言

获取系统语言&#xff0c;可以通过QLocale的接口 // 获取系统默认区域设置QLocale systemLocale QLocale::system();// 获取语言代码 (例如 "zh", "en", "ja" 等)QString language systemLocale.name().split(_).first(); //输出zh// 或者直接…...

Collection集合,List集合,set集合,Map集合

文章目录 集合框架认识集合集合体系结构Collection的功能常用功能三种遍历方式三种遍历方式的区别 List集合List的特点、特有功能ArrayList底层原理LinkedList底层原理LinkedList的应用场list:电影信息管理模块案例 Set集合set集合使用哈希值红黑树HashSet底层原理HashSet集合元…...

c++中iota容器和fill的区别

在C 中&#xff0c;std::iota 和 std::fill 都是标准库中的函数&#xff0c;用于对序列进行操作&#xff0c;它们的功能和用法如下&#xff1a; std::iota 功能&#xff1a;std::iota 函数用于将一个连续的递增序列赋值给指定范围的元素。它接受三个参数&#xff0c;第一个参…...

【CSS】层叠,优先级与继承(四):层叠,优先级与继承的关系

层叠&#xff0c;优先级与继承的关系 前文概括 【CSS】层叠&#xff0c;优先级与继承&#xff08;一&#xff09;&#xff1a;超详细层叠知识点 【CSS】层叠、优先级与继承&#xff08;二&#xff09;&#xff1a;超详细优先级知识点 【CSS】层叠&#xff0c;优先级与继承&am…...

jdk17的新特性

JDK 17 是 Java 的一个长期支持&#xff08;LTS&#xff09;版本&#xff0c;相较于 JDK 8 引入了许多新特性&#xff0c;下面从语法、性能、安全性等多个方面进行介绍&#xff1a; 语法层面 密封类&#xff08;Sealed Classes&#xff09; 简介&#xff1a;密封类和接口限制…...

C++如何分析和解决崩溃(crash)问题?如何查看core dump文件

在软件开发的世界中,C++作为一门高效且灵活的高级编程语言,广泛应用于系统编程、游戏开发、嵌入式系统以及高性能计算等领域。然而,正是由于其直接操作内存和资源的特性,C++程序在开发和运行过程中常常面临崩溃(crash)问题。这些崩溃不仅会中断程序的正常运行,还可能导致…...

Docker配置带证书的远程访问监听

一、生成证书和密钥 1、准备证书目录和生成CA证书 # 创建证书目录 mkdir -p /etc/docker/tls cd /etc/docker/tls # 生成CA密钥和证书 openssl req -x509 -newkey rsa:4096 -keyout ca-key.pem \ -out ca-cert.pem -days 365 -nodes -subj "/CNDocker CA" 2、为…...

Unity 创建、读取、改写Excel表格数据

1.导入EPPlus.dll、Excel.dll、Mysql.Data.dll、System.Data.dll&#xff1b;&#xff08;我这里用的是&#xff1a;Unity2017.3.0&#xff09; 2.代码如下&#xff1a; using System.Data; using System.IO; using UnityEngine; using OfficeOpenXml; using UnityEditor; us…...

[密码学实战]政务数据加密传输协议选型解析:IPSec、TLS与国密方案的实战选择

政务数据加密传输协议选型解析:IPSec、TLS与国密方案的实战选择 在政务数据加密传输的实际项目中,IPSec确实是一种常见方案,但并非唯一选择。政务系统的数据安全传输需综合考虑 网络层级、合规要求、性能开销 和 场景适配性 四大因素。本文结合国内政务项目实战经验,深度剖…...

使用DDR4控制器实现多通道数据读写(九)

一、本章概括 在上一节中&#xff0c;我们概括了工程的整体思路&#xff0c;并提供了工程框架&#xff0c;给出了读写DDR4寄存器的接口列表和重点时序图。当然&#xff0c;对于将DDR4内存封装成FIFO接口&#xff0c;其中的重点在于对于读写DDR4内存地址的控制&#xff0c;相对于…...

深度解析n8n全自动AI视频生成与发布工作流

工作流模版地址&#xff1a;Fully Automated AI Video Generation & Multi-Platform Publishing | n8n workflow template 本文将全面剖析基于n8n平台的这个"全自动AI视频生成与多平台发布"工作流的技术架构、实现原理和关键节点&#xff0c;帮助开发者深入理解…...

Ubuntu 22.04安装IGH

查看设备是否支持 硬件 $ sudo lshw -class network -short H/W path Device Class Description/0/100/1c/0 enp1s0 network I211 Gigabit Network Connection /0/100/1c.1/0 enp2s0 network RTL8111/8168/8411 PC…...

【华为OD机试真题】232、统计射击比赛成绩 | 机试真题+思路参考+代码分析(C++)

题目描述 给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高3个分数之和进行降序排名,输出降序排 名后的选手ID序列 条件如下: 1.一个选手可以有多个射击成绩的分数,且次序不固定 2.如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名…...

pycharm调试typescript

前言 搜索引擎搜索调试typescript&#xff0c;都是vscode&#xff0c;但是没看懂。 vscode界面简洁&#xff0c;但是适配起来用不习惯&#xff0c;还是喜欢用pycharm。 安装软件 安装Node.js https://nodejs.org/zh-cn 判断是否安装成功 node -v npm install -g typescrip…...

Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系

先说结论&#xff1a; ✅ 高阶函数既可以用 Lambda 表达式&#xff0c;也可以用函数引用&#xff01; 在 Kotlin 中&#xff0c;高阶函数&#xff08;Higher-Order Function&#xff09;和 Lambda 表达式密切相关&#xff0c;但它们是两个不同的概念&#xff1a; ✅ 简单理解…...

什么是爬虫?——从技术原理到现实应用的全面解析 II

五、现代爬虫技术面临的挑战与突破 5.1 动态网页与反爬机制的博弈 随着前端技术的演进,大量网站采用JavaScript动态渲染内容,传统爬虫难以直接获取有效数据。以下为应对单页应用(SPA)的解决方案: from selenium import webdriver from selenium.webdriver.chrome.optio…...