当前位置: 代码网 > it编程>编程语言>Java > 关于集合与数组转换实现方法

关于集合与数组转换实现方法

2025年06月30日 Java 我要评论
在 java 中,list.toarray()和arrays.aslist()是两个常见的集合与数组转换方法。它们的行为和对原始数据的影响有显著区别,下面详细分析它们的机制及对数据修改的影响。如下图示

在 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是固定大小的

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com