`
Everyday都不同
  • 浏览: 713395 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

List集合的复制方式小结

阅读更多

方式一:

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的复制拷贝方式研究同理,这里不再赘述。

0
0
分享到:
评论
1 楼 yanxing2012 2017-03-08  
写的不对,http://blog.csdn.net/lian_1988/article/details/45970927

相关推荐

    C++ STL 开发技术导引(第6章)

    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 ...

    C++ STL开发技术导引(第5章)

    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 ...

    C++ STL开发技术导引(第3章)

    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 ...

    AspNet MVC 开发技术

    1.4 小结 9 1.5 本章要点 10 第2章 编写C#程序 11 2.1 开发环境 12 2.1.1 visual studio 2010 12 2.1.2 visual C# 2010 express edition 14 2.2 控制台应用程序 15 2.2.1 solution explorer 19 2.2.2 properties窗口...

    ASP3《高级编程》(第一部分)

    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 ...

    ASP3《高级编程》(第二部分)

    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 ...

    21天学通Java-由浅入深

    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...

    javaSE代码实例

    1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 ...

    疯狂JAVA讲义

    1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML...

    Java开发技术大全 电子版

    1.5本章小结18 第2章Java语言基础19 2.1Java语言的特点19 2.2Java程序的构成21 2.3数据类 型23 2.3.1基本数据类型23 2.3.2常量25 2.3.3变量26 2.3.4整型数据27 .2.3.5浮点型数据29 2.3.6字符型数据30 ...

Global site tag (gtag.js) - Google Analytics