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

相关推荐

  1. `List<String>`转换`List<Long>`

    2024-03-10 08:10:02       56 阅读
  2. 数组转换树形结构

    2024-03-10 08:10:02       52 阅读
  3. 字符串转换Python数据类型

    2024-03-10 08:10:02       31 阅读
  4. 前端列表数据转换树形数据函数

    2024-03-10 08:10:02       39 阅读
  5. 在 Qt 中如何数字转换QString

    2024-03-10 08:10:02       51 阅读
  6. List转换Map

    2024-03-10 08:10:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-10 08:10:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-10 08:10:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-10 08:10:02       82 阅读
  4. Python语言-面向对象

    2024-03-10 08:10:02       91 阅读

热门阅读

  1. 50道SQL面试题

    2024-03-10 08:10:02       33 阅读
  2. centos 7 使用yum进行安装docker及docker的使用

    2024-03-10 08:10:02       42 阅读
  3. Docker compose部署redis哨兵集群

    2024-03-10 08:10:02       36 阅读
  4. docker导出导入镜像或容器

    2024-03-10 08:10:02       47 阅读
  5. srlua打包(Lua 5.4.6)

    2024-03-10 08:10:02       43 阅读
  6. Git 开源的版本控制系统-05-tags 标签管理

    2024-03-10 08:10:02       51 阅读
  7. 百度信息流

    2024-03-10 08:10:02       51 阅读
  8. 百度AI千帆大模型示例代码 GO语言版

    2024-03-10 08:10:02       43 阅读
  9. Mac安装oh-my-zsh

    2024-03-10 08:10:02       41 阅读
  10. Centos下安装Redis6.X

    2024-03-10 08:10:02       49 阅读
  11. PHP伪协议详解

    2024-03-10 08:10:02       47 阅读
  12. 【MapReduce】02.Hadoop序列化

    2024-03-10 08:10:02       46 阅读
  13. Spring Boot面试系列-01

    2024-03-10 08:10:02       48 阅读