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

将List转换为数组或者将数组转换为List,如果改变了原始值,转换后的数据会发生改变吗?

将List转换为数组或将数组转换为List涉及到数据结构的变化。在Java中,这两种转换是否会影响原始数据取决于转换的方式和使用的数据结构。下面分别解释这两种情况:

将List转换为数组

当你将一个List转换为数组时,通常通过List的toArray()方法。这个过程实质上是创建了一个新的数组对象,并将List中的元素复制到这个新数组中。因此,转换后的数组是一个全新的对象,原始的List不会因为数组的修改而改变。

使用toArray()方法: 这种方式不会改变原始的List中的数据。它创建了一个新的数组,数组中的元素是从List中复制过来的。这是一个浅拷贝过程,因为数组中的元素是对原始List元素的引用。如果List中存储的是不可变对象(如String、Integer等),修改转换后的数组中的元素不会影响原始List。但如果List中存储的是可变对象的引用,那么修改这些对象的状态仍然会影响到原始List中的相应对象,因为数组和List中的元素是共享相同的引用。

示例代码:

List<String> list = new ArrayList<>();
list.add("Element1");
list.add("Element2");
String[] array = list.toArray(new String[0]);

在这个例子中,修改array中的元素不会影响list中的元素,因为它们位于不同的内存地址。

将数组转换为List

数组转换为List可以通过Arrays.asList()方法。这个转换实际上并不创建一个新的List对象,而是返回一个固定大小的List视图,这个视图直接背后是原数组。因此,通过这个List视图对元素进行的修改会反映在原始数组中。但是,需要注意的是,这个List视图的大小是固定的,不支持添加或删除元素。

使用Arrays.asList()方法: 这会返回一个固定大小的List视图,其背后是原始数组。这也是一种浅拷贝。因为得到的List直接引用了原始数组,所以修改这个List(只能修改元素,不能添加或删除)会直接反映到原始数组上。同样,修改原数组的内容也会影响这个List。注意,因为这个List的大小是固定的,所以它不支持添加或删除元素的操作。

使用new ArrayList<>(Arrays.asList(array)): 这种方式会创建一个全新的ArrayList,并将数组中的元素复制到这个新的List中。这个过程是浅拷贝,因为复制的只是引用。但是,由于现在有了一个全新的List,对这个List的修改(添加、删除、修改元素)不会影响到原始的数组。同样,如果List中的元素是可变对象,修改这些对象的状态仍会影响到数组中的相应对象,如果这些对象在数组中也有引用。

示例代码:

String[] array = new String[]{"Element1", "Element2"};
List<String> list = Arrays.asList(array);
list.set(0, "New Element"); // 这会改变原始数组的内容

在这个例子中,修改list中的元素实际上会改变array中对应元素的值。但如果尝试对list执行添加或删除操作,会抛出UnsupportedOperationException

结论

  • 将List转换为数组不会使原List与新数组共享数据;修改新数组不会影响原List。
  • 将数组转换为List可能会返回一个固定大小的List视图,该视图与原数组共享数据;通过这个视图修改元素会影响原数组。但对这个List视图的结构修改(如添加或删除元素)是不被支持的。

因此,转换后的数据是否会发生改变取决于你是如何进行转换的以及你对转换结果进行了哪些操作。

无论是将List转换为数组还是将数组转换为List,通常情况下都是进行浅拷贝。这意味着复制的是元素的引用,而不是元素本身。因此,对于存储可变对象的集合或数组,转换过程中的修改可能会相互影响,具体取决于是否有新的集合或数组被创建,以及是如何操作这些集合或数组的。

相关文章:

  • 设计模式大题做题记录
  • 安装系统后,如何单个盘空间扩展多个盘空间?
  • ChatGPT的安全警告
  • 一篇搞定分布式缓存
  • 低空经济20人|卓翼智能任雪峰:以技术驱动市场,引领无人机细分领域创新
  • 找出单身狗1,2
  • 航测管家:智能化革新航测作业流程
  • bugku-misc隐写
  • 混合云构建-VPN打通阿里云和AWS云
  • 20 卷积层里的填充和步幅【李沐动手学深度学习v2课程笔记】
  • 无限debugger的几种处理方式
  • Node.js与Webpack笔记(一)
  • 【Oracle不停库迁移, 迁移完成无法启动】
  • 开发一套小程序所需的费用取决于多个因素
  • C++指针(四)万字图文详解!
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 10个最佳ES6特性 ES7与ES8的特性
  • Codepen 每日精选(2018-3-25)
  • MobX
  • MySQL QA
  • Terraform入门 - 1. 安装Terraform
  • XForms - 更强大的Form
  • 十年未变!安全,谁之责?(下)
  • 时间复杂度与空间复杂度分析
  • 详解NodeJs流之一
  • 想写好前端,先练好内功
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一个项目push到多个远程Git仓库
  • Hibernate主键生成策略及选择
  • ​queue --- 一个同步的队列类​
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (03)光刻——半导体电路的绘制
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (8)STL算法之替换
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (补)B+树一些思想
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (九)One-Wire总线-DS18B20
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)appium-desktop定位元素原理
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)nsfocus-绿盟科技笔试题目
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .jks文件(JAVA KeyStore)
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 读取 JSON格式的数据
  • .NET 回调、接口回调、 委托
  • .Net 中Partitioner static与dynamic的性能对比
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [ NOI 2001 ] 食物链
  • [20181219]script使用小技巧.txt
  • [AAuto]给百宝箱增加娱乐功能
  • [Android]RecyclerView添加HeaderView出现宽度问题