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

深入探讨集合与数组转换方法

目录

1、Arrays.asList() 

1.1、方法作用

1.2、内部实现

1.3、修改元素的影响

1.4、注意事项

2、list.toArray() 

2.1、方法作用

2.2、内部实现

2.3、修改元素的影响

2.4、特殊情况

1、对象引用

2、数组copy

3、对比总结

4、常见误区与解决方案

5、实际应用建议


前言

        在 Java 中,list.toArray() 和 Arrays.asList() 是两个常见的集合与数组转换方法。

        它们的行为和对原始数据的影响有显著区别,下面详细分析它们的机制及对数据修改的影响。如下图示:


1、Arrays.asList() 

1.1、方法作用

        Arrays.asList(T....elements) 将数组或多个元素转换为一个 List,返回的是  java.util.Arrays.ArrayList(不是  java.util.ArrayList)的实例。

1.2、内部实现

  • 这个 List 是基于原始数组的视图,即底层直接引用原始数组。
  • 该 List 的大小是固定的(不能添加或删除元素),但可以修改元素内容。

1.3、修改元素的影响

  • 修改 List 中的元素 → 会影响原始数组,因为两者共享同一内存地址。
  • 修改原始数组的元素 → 也会影响 List。

示例代码

String[] arr = {"A", "B", "C"};
List<String> list = Arrays.asList(arr);// 修改 List 中的元素
list.set(0, "X");
System.out.println(Arrays.toString(arr)); // 输出: [X, B, C]// 修改原始数组
arr[1] = "Y";
System.out.println(list); // 输出: [X, Y, C]

1.4、注意事项

  • 不能添加/删除元素:调用 add() 或 remove() 会抛出 UnsupportedOperationException。
  • 结构修改限制:仅支持修改元素内容,不支持改变集合大小。

2、list.toArray() 

2.1、方法作用

        list<T>.toArray()  将集合转换为一个数组,返回的是新数组的引用。

2.2、内部实现

  • 不论调用 list.toArray() 还是 list.toArray()(T[] a),最终都会创建一个新的数组,复制集合中的元素
  • 新数组与原始集合完全独立,修改数组中的元素不会影响集合,反之亦然。

2.3、修改元素的影响

  • 修改数组中的元素 → 不会影响原始集合。
  • 修改集合中的元素 → 不会影响数组。

示例:

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
String[] arr = list.toArray(new String[0]);// 修改数组中的元素
arr[0] = "X";
System.out.println(list); // 输出: [A, B, C]// 修改集合中的元素
list.set(1, "Y");
System.out.println(Arrays.toString(arr)); // 输出: [X, B, C]

2.4、特殊情况

1、对象引用

        如果集合中存储的是对象引用(而非基本类型),修改对象的属性会影响原始集合和数组,因为它们指向同一个对象实例。

示例:

List<User> list = new ArrayList<>();
User user = new User("Tom");
list.add(user);
User[] arr = list.toArray(new User[0]);// 修改对象属性
arr[0].setName("Jerry");
System.out.println(list.get(0).getName()); // 输出: Jerry

2、数组copy

⚠️注意:强行使用array增加元素copy。

可参考:

String[] array = {"1", "2"}; // 原始数组
String[] newArray = new String[array.length + 1]; // 新建长度+1的数组
System.arraycopy(array, 0, newArray, 0, array.length); // 复制旧元素
newArray[newArray.length - 1] = "3"; // 添加新元素

小结:


3、对比总结


4、常见误区与解决方案

4.1 误区:Arrays.asList()可以创建动态列表

  • 错误:Arrays.asList()返回的列表是固定大小的,不能添加或删除元素。
  • 解决方案:如果需要动态列表,需显式转换为 new ArrayList<>(Arrays.asList(.....))。

4.4 误区 :Arrays.asList() 返回的是 java.util.ArrayList

  • 错误:Arrays.asList() 返回的是 java.util.Arrays.ArrayList,不是 java.util.ArrayList。
  • 解决方案:如果需要动态列表,显式使用  new ArrayList<>()。

4.2 误区:list.toArray() 返回的数组是集合的引用

  • 错误:list.toArray() 返回的是新数组,与集合无直接关联。
  • 解决方案:如果需要共享数据,应直接操作集合或使用 Arrays.asList()。

4.3 误区:对象引用的修改不会影响彼此

  • 注意:如果数组或集合中的元素是对象引用,修改对象的属性会同步到彼此。
  • 解决方案:如果需要独立拷贝,需手动深拷贝对象。

5、实际应用建议

  • 需要修改元素且避免副作用:使用 Arrays.asList(),但需确保不进行结构性修改。
  • 需要独立数组:使用 list.toArray()。
  • 需要动态列表:使用  new ArrayList<>(Arrays.asList(.....))。
  • 涉及对象引用时:注意深拷贝或使用不可变对象。

举例:

ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
arrayList.add("4");
arrayList.add("5");
System.out.println("修改前的arrayList" + arrayList); // 输出: [1, 2, 3, 4, 5]
System.out.println("arrayList的size==" + arrayList.size()); // 输出: 5// 转换为数组
String[] array = arrayList.toArray(new String[0]);
array[0] = "6"; 
System.out.println("修改后的array" + Arrays.toString(array)); // 输出: [6, 2, 3, 4, 5]
System.out.println("修改后的arrayList" + arrayList); // 输出: [1, 2, 3, 4, 5]

关键点解释

1. list.toArray() 返回的是 新数组

  • arrayList.toArray(new String[0])会创建一个新的数组,并将 arrayList 中的所有元素复制到这个数组中。
  • 新数组和 arrayList 是独立的,它们的内存地址不同。

2. 修改数组元素不影响原集合

  • 在代码中,array[0] = "6" 只是修改了数组的第 0 个元素,但 arrayList 仍然指向原来的字符串对象 "1"
  • 因为 String 是不可变类型(Immutable),所以修改数组中的元素不会影响 arrayList 中的值。

3. 为什么原集合没有变化?

  • arrayList 和 array 是两个独立的数据结构:
    • arrayList 是一个动态集合,内部通过数组实现。
    • array 是一个静态数组,与 arrayList 无关。
  • 修改 array 中的元素,不会改变 arrayList 内部的数组内容

对比:如果元素是可变对象

        如果集合中存储的是可变对象(如自定义类),修改数组中的对象属性会影响原集合,因为它们引用的是同一个对象实例。

例如:

class User {String name;public User(String name) { this.name = name; }public void setName(String name) { this.name = name; }
}List<User> list = new ArrayList<>();
User user = new User("Tom");
list.add(user);
User[] array = list.toArray(new User[0]);// 修改数组中的对象属性
array[0].setName("Jerry");
System.out.println(list.get(0).name); // 输出: Jerry

// ✅ 可以动态添加元素
List<String> list = new ArrayList<>(Arrays.asList("1", "2"));
list.add("3"); // 成功添加// ❌ 无法动态添加元素
List<String> stringList = Arrays.asList("3", "4");
stringList.add("3"); // 抛出 UnsupportedOperationException
stringList.add("4"); // 抛出 UnsupportedOperationException

        核心原因:Arrays.asList() 返回的 List 是固定大小的


总结:

相关文章:

深入探讨集合与数组转换方法

目录 1、Arrays.asList() 1.1、方法作用 1.2、内部实现 1.3、修改元素的影响 1.4、注意事项 2、list.toArray() 2.1、方法作用 2.2、内部实现 2.3、修改元素的影响 2.4、特殊情况 1、对象引用 2、数组copy 3、对比总结 4、常见误区与解决方案 5、实际应用建议…...

让大模型看得见自己的推理 — KnowTrace结构化知识追踪

让大模型“看得见”自己的推理 —— KnowTrace 结构化知识追踪式 RAG 全解析 一句话概括:把检索-推理“改造”成 动态知识图构建任务,再让 LLM 只关注这张不断精炼的小图 —— 这就是显式知识追踪的核心价值。 1. 背景:为什么 RAG 仍难以搞定多跳推理? 长上下文负担 传统 I…...

【HarmonyOS 5应用架构详解】深入理解应用程序包与多Module设计机制

⭐本期内容&#xff1a;【HarmonyOS 5应用架构详解】深入理解应用程序包与多Module设计机制 &#x1f3c6;系列专栏&#xff1a;鸿蒙HarmonyOS&#xff1a;探索未来智能生态新纪元 文章目录 前言应用与应用程序包应用程序的基本概念应用程序包的类型标识机制应用安装流程 应用的…...

【Oracle】DCL语言

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. DCL概述1.1 什么是DCL&#xff1f;1.2 DCL的核心功能 2. 用户管理2.1 创建用户2.2 修改用户2.3 删除用户2.4 用户信息查询 3. 权限管理3.1 系统权限3.1.1 授予系统权限3.1.2 撤销系统权限 3.2 对象权限3.2.1…...

MySQL强化关键_017_索引

目 录 一、概述 二、索引 1.主键索引 2.唯一索引 3.查看索引 4.添加索引 &#xff08;1&#xff09;建表时添加 &#xff08;2&#xff09;建表后添加 5.删除索引 三、树 1.二叉树 2.红黑树 3.B树 4.B树 &#xff08;1&#xff09;为什么 MySQL 选择B树作为索引…...

stm32——SPI协议

stm32——SPI协议 STM32的SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外设接口&#xff09;协议是一种高速、全双工、同步的串行通信协议&#xff0c;广泛评估微控制器与各种外设&#xff08;如传感器、器件、显示器、模块等&#xff09;之间的数据传输。STM3…...

Linux 下如何查看进程的资源限制信息?

简介 Linux 上的 cat /proc/$pid/limits 命令提供有关特定进程的资源限制的信息&#xff0c;其中 $pid 是相关进程的进程 ID &#xff08;pid&#xff09;。该文件是 /proc 文件系统的一部分&#xff0c;该文件系统是一个虚拟文件系统&#xff0c;提供有关进程和系统资源的信息…...

【备忘】php命令行异步执行超长时间任务

环境说明&#xff1a; 操作系统&#xff1a;windows10 IDE&#xff1a;phpstorm 开发语言&#xff1a;php7.4 框架&#xff1a;thinkphp5.1 测试环境&#xff1a;linuxwindows均测试通过。 初级方法&#xff1a; function longRunningTask() {$root_path Tools::get_ro…...

对于ARM开发各种手册的分类

手册名称全称主要内容适用范围是不是讲SysTick&#xff1f;Cortex-M3 Technical Reference Manual (TRM)Cortex-M3 Technical Reference Manual描述 Cortex-M3内核架构&#xff0c;如寄存器模型、总线接口、指令集、异常模型只适合 Cortex-M3 内核&#xff0c;不含外设❌ 没有C…...

java开发中#和$的区别

在Spring框架中&#xff0c;$ 和 # 是两种不同的表达式前缀&#xff0c;用于从不同的来源获取值或执行计算。下面详细解释它们的区别和用法&#xff1a; 一、$ 占位符&#xff08;Property Placeholder&#xff09; 1. 作用 从配置文件&#xff08;如 application.propertie…...

在 RK3588 上通过 VSCode 远程开发配置指南

在 RK3588 上通过 VSCode 远程开发配置指南 RK3588 设备本身不具备可视化编程环境&#xff0c;但可以通过 VSCode 的 Remote - SSH 插件 实现远程代码编写与调试。以下是完整的配置流程。 一、连接 RK3588 1. 安装 Debian 系统 先在 RK3588 上安装 Debian 操作系统。 2. 安…...

OpenHarmony标准系统-HDF框架之音频驱动开发

文章目录 引言OpenHarmony音频概述OpenHarmony音频框图HDF音频驱动框架概述HDF音频驱动框图HDF音频驱动框架分析之音频设备驱动HDF音频驱动框架分析之supportlibs实现HDF音频驱动框架分析之hdi-passthrough实现HDF音频驱动框架分析之hdi-bindev实现HDF音频驱动加载过程HDF音频驱…...

HTML Day03

Day03 0. 引言1. CSS1.1 CSS的3种使用方法1.2 内联样式1.3 内部样式表1.4 外部CSS文件 2. 图像3. 表格3.1单元格间距和单元格边框 4. 列表4.1 有序表格的不同类型4.2 不同类型的无序表格4.3 嵌套列表 5. 区块6. 布局6.1 div布局6.2 表格布局 0. 引言 HELLO ^ _ ^大家好&#xf…...

篇章六 数据结构——链表(二)

目录 1. LinkedList的模拟实现 1.1 双向链表结构图​编辑 1.2 三个简单方法的实现 1.3 头插法 1.4 尾插法 1.5 中间插入 1.6 删除 key 1.7 删除所有key 1.8 clear 2.LinkedList的使用 2.1 什么是LinkedList 5.2 LinkedList的使用 1.LinkedList的构造 2. LinkedList的…...

Python60日基础学习打卡Day39

昨天我们介绍了图像数据的格式以及模型定义的过程&#xff0c;发现和之前结构化数据的略有不同&#xff0c;主要差异体现在2处 模型定义的时候需要展平图像由于数据过大&#xff0c;需要将数据集进行分批次处理&#xff0c;这往往涉及到了dataset和dataloader来规范代码的组织…...

吴恩达MCP课程(3):mcp_chatbot

原课程代码是用Anthropic写的&#xff0c;下面代码是用OpenAI改写的&#xff0c;模型则用阿里巴巴的模型做测试 .env 文件为&#xff1a; OPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx OPENAI_API_BASEhttps://dashscope.aliyuncs.com/compatible-mode…...

MySQL访问控制与账号管理:原理、技术与最佳实践

MySQL的安全体系建立在精细的访问控制和账号管理机制上。本文基于MySQL 9.3官方文档&#xff0c;深入解析其核心原理、关键技术、实用技巧和行业最佳实践。 一、访问控制核心原理&#xff1a;双重验证机制 连接验证 (Connection Verification) 客户端发起连接时&#xff0c;MyS…...

AWS 创建VPC 并且添加权限控制

AWS 创建VPC 并且添加权限控制 以下是完整的从0到1在AWS中创建VPC并配置权限的步骤&#xff08;包含网络配置、安全组权限和实例访问&#xff09;&#xff1a; 1. 创建VPC 步骤&#xff1a; 登录AWS控制台 访问 AWS VPC控制台&#xff0c;点击 创建VPC。 配置基础信息 名称…...

langchain学习 01

dotenv库&#xff1a;可以从.env文件中加载配置信息。 from dotenv import load_dotenv # 加载函数&#xff0c;之后调用这个函数&#xff0c;即可获取配置环境.env里面的内容&#xff1a; deep_seek_api_key<api_key>getpass库&#xff1a;从终端输入password性质的内…...

【清晰教程】查看和修改Git配置情况

目录 查看安装版本 查看特定配置 查看全局配置 查看本地仓库配置 设置或修改配置 查看安装版本 打开命令行工具&#xff0c;通过version命令检查Git版本号。 git --version 如果显示出 Git 的版本号&#xff0c;说明 Git 已经成功安装。 查看特定配置 如果想要查看特定…...

JAVA 常用 API 正则表达式

1 正则表达式作用 作用一&#xff1a;校验字符串是否满足规则作用二&#xff1a;在一段文本中查找满足要求的内容 2 正则表达式规则 2.1 字符类 package com.bjpowernode.test14;public class RegexDemo1 {public static void main(String[] args) {//public boolean matche…...

光电设计大赛智能车激光对抗方案分享:低成本高效备赛攻略

一、赛题核心难点与备赛痛点解析 全国大学生光电设计竞赛的 “智能车激光对抗” 赛题&#xff0c;要求参赛队伍设计具备激光对抗功能的智能小车&#xff0c;需实现光电避障、目标识别、轨迹规划及激光精准打击等核心功能。从历年参赛情况看&#xff0c;选手普遍面临三大挑战&a…...

Python实现P-PSO优化算法优化BP神经网络回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代&#xff0c;回归分析作为预测和建模的重要工具&#xff0c;在科学研究和工业应用中占据着重要…...

Microsoft的在word中选择文档中的所有表格进行字体和格式的调整时的解决方案

找到宏 创建 并粘贴 使用 Sub 全选所有表格() Dim t As Table an MsgBox("即将选择选区内所有表格&#xff0c;若无选区&#xff0c;则选择全文表格。", vbYesNo, "reboot提醒您!") If an - 6 Then Exit Sub Set rg IIf(Selection.Type wdSelectionIP, …...

C++23:关键特性与最新进展深度解析

文章目录 范围的新功能与增强元组的优化与新特性字符与字符串的转义表示优化std::thread::id的改进与扩展栈踪迹的格式化支持结论 C23作为C标准的最新版本&#xff0c;带来了许多令人瞩目的改进和新特性。从新的范围和元组功能到对字符和字符串转义表示的优化&#xff0c;再到 …...

Rust并发编程实践指南

Rust并发编程实践指南 一、Rust并发编程哲学 mindmaproot((Rust并发))Ownership System▶ 移动语义▶ 借用规则Type Safety▶ Send Trait▶ Sync TraitZero-Cost Abstraction▶ 无运行时开销▶ 编译期检查Fearless Concurrency▶ 数据竞争预防▶ 死锁检测工具二、核心并发模型…...

Kubernetes资源申请沾满但是实际的资源占用并不多,是怎么回事?

Kubernetes资源申请沾满但是实际的资源占用并不多是Kubernetes资源管理中的一个常见误解。 K8s资源管理机制 资源请求(Requests) vs 实际使用量 从你的截图可以看到&#xff1a; K8s节点资源状态&#xff08;第一张图&#xff09;&#xff1a; CPU请求量&#xff1a;13795…...

鲲鹏Arm+麒麟V10 K8s 离线部署教程

针对鲲鹏 CPU 麒麟 V10 的离线环境&#xff0c;手把手教你从环境准备到应用上线&#xff0c;所有依赖包提前打包好&#xff0c;步骤写成傻瓜式操作指南。 一、环境规划# 准备至少两台机器。 架构OS作用Arm64任意&#xff0c;Mac 也可以下载离线包Arm64麒麟 V10单机部署 K8s…...

PGSQL结合linux cron定期执行vacuum_full_analyze命令

‌VACUUM FULL ANALYZE 详解‌ 一、核心功能 ‌空间回收与重组‌ 完全重写表数据文件&#xff0c;将碎片化的存储空间合并并返还操作系统&#xff08;普通 VACUUM 仅标记空间可重用&#xff09;。彻底清理死元组&#xff08;已删除或更新的旧数据行&#xff09;&#xff0c;解…...

php 中使用MQTT

MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 &#xff0c;可以用极少的代码和带宽为联网设备提供实时可靠的消息服务&#xff0c;它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。 本文主要介绍如何在 PHP项目中使用composer require php-m…...