方式一:
List<String> l = new ArrayList<String>(); l.add("a"); l.add("b"); l.add("c"); List<String> l2 = new ArrayList<String>(l); l2.add("d"); System.out.println(l2); System.out.println(l);
跑的结果:
[a, b, c, d]
[a, b, c]
说明:通过new ArrayList<T>(List<T> srcList)的方式复制一个集合,是单独开辟了一个内存空间,并且内容跟源集合的内容一样。对新集合的修改并不影响源集合。
方式二:
List<String> l = new ArrayList<String>(); l.add("a"); l.add("b"); l.add("c"); List<String> l2 = new ArrayList<String>(); l2.addAll(l); l2.add("d"); System.out.println(l2); System.out.println(l);
打印结果:
[a, b, c, d]
[a, b, c]
说明:通过addAll的方法复制一个集合,新的集合也是单独开辟了一个内存空间。当然新集合的操作不影响源集合。
方式三:
List<String> l = new ArrayList<String>(); l.add("a"); l.add("b"); l.add("c"); List<Object> l2 = new ArrayList<Object>(Arrays.asList(new Object[l.size()])); Collections.copy(l2, l); l2.add("d"); System.out.println(l2); System.out.println(l);
打印结果:
[a, b, c, d]
[a, b, c]
说明:使用集合的工具类的静态方法Collections.copy(List desList, List srcList)的方式复制集合,得到的也是一个位于内存中不同空间的副本。
注意这种方式,如果你直接这样写:
List<String> l2 = new ArrayList<String>(); Collections.copy(l2, l);
会报错:java.lang.IndexOutOfBoundsException: Source does not fit in dest
原因是你使用该方法时,会先比较目标集合和源集合的size,而你直接new ArrayList<String>();还没来得及复制,目标集合的size为0,和源集合的size不一样,就会报错。注:new ArrayList(int size)定义的是该集合的的容纳能力为size,并不是说目标集合中就有了size个元素。所以要这样写:new ArrayList<Object>(Arrays.asList(new Object[l.size()]));
方式四:
List<String> l = new ArrayList<String>(); l.add("a"); l.add("b"); l.add("c"); List<String> l2 = l; l2.add("d"); System.out.println(l2); System.out.println(l);
这次的打印结果为:
[a, b, c, d]
[a, b, c, d]
说明:这种方式只是定义了另一个引用,但是指向的内容还是源集合指向的内容。所以对其修改当然会影响源集合了。
方式五:流式拷贝(适用于集合类型为非一般类型的情形)
public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(src); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in = new ObjectInputStream(byteIn); @SuppressWarnings("unchecked") List<T> dest = (List<T>) in.readObject(); return dest; }
对Map, Set的复制拷贝方式研究同理,这里不再赘述。
相关推荐
1.12 本章小结 23 第2章 C++模板技术 25 2.1 函数模板 25 2.2 类模板 27 2.3 模板完全特化 28 2.4 函数模板重载 30 2.5 类模板继承 30 2.6 本章小结 31 第3章 C++ I/O流技术 32 3.1 I/O流类 32 ...
1.12 本章小结 23 第2章 C++模板技术 25 2.1 函数模板 25 2.2 类模板 27 2.3 模板完全特化 28 2.4 函数模板重载 30 2.5 类模板继承 30 2.6 本章小结 31 第3章 C++ I/O流技术 32 3.1 I/O流类 32 ...
1.12 本章小结 23 第2章 C++模板技术 25 2.1 函数模板 25 2.2 类模板 27 2.3 模板完全特化 28 2.4 函数模板重载 30 2.5 类模板继承 30 2.6 本章小结 31 第3章 C++ I/O流技术 32 3.1 I/O流类 32 ...
**小结** 简单动态字符串(SDS)是Redis中一种重要的基础数据结构,它在保证字符串操作高效的同时,也为Redis提供了灵活的内存管理机制。 ##### 1.2 双端链表 (Doubly Linked List) **双端链表的应用** 双端链表在...
它不仅支持简单的字符串(String)类型,还支持哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)等多种数据结构。这些数据结构的设计使得Redis在处理多种应用场景时表现出色,例如缓存、消息队列、...
10.4.4 数据分页小结 336 10.5 使用数据库中的图像 337 10.6 小结 338 第11章 使用XML数据 339 11.1 XML的定义 339 11.1.1 XML和HTML的差别 340 11.1.2 标记和元素 343 11.1.3 模式和文档类型定义 346 ...
10.4.4 数据分页小结 336 10.5 使用数据库中的图像 337 10.6 小结 338 第11章 使用XML数据 339 11.1 XML的定义 339 11.1.1 XML和HTML的差别 340 11.1.2 标记和元素 343 11.1.3 模式和文档类型定义 346 ...
在C#编程语言中,数组是一种基础数据结构,用于存储同一类型的数据集合。数组提供了高效且方便的方式来组织和访问数据。以下是对C#数组常用操作方法的详细说明: 1. **数组的声明和赋值**: - 单行声明并初始化:`...
87 5.3 数组操作的举例 88 5.3.1 数组元素值的复制 88 5.3.2 数组元素的排序 90 5.3.3 在数组里查找指定元素 91 5.3.4 利用数组打印26个英文字母 92 5.4 综合练习 93 5.5 小结 94 5.6 习题 94 第二篇 面向对象篇 第6...