文章目录

  • java:List的深拷贝
    • 1. CollectionUtils.addAll与Collections.copy结合实现深拷贝
    • 2. List.toArray与CollectionUtils.addAll结合实现深拷贝
    • 3、在使用Collections.copy(dest, src)时,目标dest的长度必须大于等于src的长度;
    • 4、Collections.copy实现的是覆盖替换,而不是追加新增;
    • 参考文章

java:List的深拷贝

相关方法调用:
void org.apache.commons.collections.CollectionUtils.addAll(Collection collection, Object[] elements)
Integer[] java.util.List.toArray(Integer[] a)
void java.util.Collections.copy(List<? super Integer> dest, List<? extends Integer> src)

1. CollectionUtils.addAll与Collections.copy结合实现深拷贝

import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class CopyTest {public static void main(String[] args) {List<Integer> list = new ArrayList<>();for (int i = 0; i < 10; i++) {list.add(i);}//list深度拷贝List<Integer> newList = new ArrayList<>();CollectionUtils.addAll(newList, new Object[list.size()]);Collections.copy(newList, list);newList.set(0, 10);System.out.println("原list值:" + list);System.out.println("新list值:" + newList);}
}

测试结果:

原list值:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
新list值:[10, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2. List.toArray与CollectionUtils.addAll结合实现深拷贝

    /*** 深拷贝:* 现将list使用list.toArray转成数组,再使用CollectionUtils.addAll复制到新的list中*/@Testpublic void test2(){List<Integer> oldList = new ArrayList<Integer>();for (int i = 0; i < 10; i++) {oldList.add(i);}Integer[] intArray = new Integer[oldList.size()];oldList.toArray(intArray);//输出intArray进行查看String str = "";for(Integer inte : intArray){str = str + inte + ",";}System.out.println("---intArray : "+str);List<Integer> newList = new ArrayList<Integer>();CollectionUtils.addAll(newList, intArray);System.out.println("---1---newList.size()=" + newList.size());System.out.println("---1---新list值:" + newList);newList.set(0, 10);System.out.println("原list值:" + oldList);System.out.println("新list值:" + newList);}

执行结果:

---intArray : 0,1,2,3,4,5,6,7,8,9,
---1---newList.size()=10
---1---新list值:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
原list值:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
新list值:[10, 1, 2, 3, 4, 5, 6, 7, 8, 9]

3、在使用Collections.copy(dest, src)时,目标dest的长度必须大于等于src的长度;

举例如下:
List src1 = new ArrayList( 3 )
src1.add( " a " );
src2.add( " b " );
src3.add( " c " );
如果使用下面方法copy链表:
/** **************************** */
List des1 = new ArrayList( 3 );
Collections.copy(des1,src1);
/** **************************** */
将会出错,抛出数组越界异常。
当时我怎么想都想不明白为什么,明明已经设置了长度为3,为什么还会出错!
后来打印出des1.size()才知道des1的长度为0;3表示的是这个List的容纳能力为3,并不是说des1中就有了3个元素。查看api才知 道,它的capacity(容纳能力大小)可以指定(最好指定)。而初始化时size的大小永远默认为0,只有在进行add和remove等相关操作 时,size的大小才变化。然而进行copy()时候,首先做的是将desc1的size和src1的size大小进行比较,只有当desc1的 size 大于或者等于src1的size时才进行拷贝,否则抛出IndexOutOfBoundsException异常。
java.util.Collections.copy()方法注意点 - 我的JAVA快乐生活 - CSDN博客 https://blog.csdn.net/liulin_good/article/details/6109090

4、Collections.copy实现的是覆盖替换,而不是追加新增;

@Testpublic void test3(){List<Integer> list = new ArrayList<Integer>();for (int i = 0; i < 10; i++) {list.add(i);}//list深度拷贝List<Integer> newList = new ArrayList<Integer>();
//        CollectionUtils.addAll(newList, new Object[list.size()]);for (int i = 0; i < 15; i++) {newList.add(i+100);}System.out.println("---1---newList.size()=" + newList.size());System.out.println("---1---newList值:" + newList);Collections.copy(newList, list);System.out.println("---2---newList.size()=" + newList.size());System.out.println("---2---newList值:" + newList);newList.set(0, 10);System.out.println("原list值:" + list);System.out.println("新list值:" + newList);}

执行结果:

---1---newList.size()=15
---1---newList值:[100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114]
---2---newList.size()=15
---2---newList值:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 110, 111, 112, 113, 114]
原list值:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
新list值:[10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 110, 111, 112, 113, 114]

参考文章

CollectionUtils.addAll() 数组转Collection - - ITeye博客
https://zjshuai2030.iteye.com/blog/1481452
Java中list集合深复制 - 健旺 - 博客园
https://www.cnblogs.com/liujianwang/p/9103690.html

java:List的深拷贝相关推荐

  1. 谈一谈Java中的深拷贝和浅拷贝

    在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值.浅拷贝.深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存 ...

  2. java什么地方要用深拷贝,关于 Java 浅拷贝、深拷贝,你真的知道了吗?

    这是今天我们在技术群里面讨论的一个知识点,讨论的相当激烈,由于对这一块使用的比较少,所以对这一块多少有些盲区.这篇文章总结了所讨论的内容,希望这篇文章对你有所帮助. 在 Java 开发中,对象拷贝或者 ...

  3. Java 浅拷贝、深拷贝,你知多少?

    在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值.浅拷贝.深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存 ...

  4. Java 深入理解深拷贝和浅拷贝区别

    title: Java 深入理解深拷贝和浅拷贝区别 date: 2021-6-19 updated: 2021-6-19 tags: Java 深拷贝和浅拷贝 categories: 面试 Java ...

  5. java 如何实现深拷贝

    1.什么叫Java浅拷贝?  浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝.如果属性是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是 ...

  6. java 深克隆(深拷贝)与浅克隆(拷贝)详解

    java深克隆和浅克隆 基本概念 浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所拷贝的对象,而不复制它所引用的对 ...

  7. Java提高篇 —— Java浅拷贝和深拷贝

    一.前言 我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性能 ...

  8. Java中的深拷贝(深复制)和浅拷贝(浅复制)

    深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复 ...

  9. Java 浅拷贝和深拷贝的理解和实现方式

    https://www.cnblogs.com/shakinghead/p/7651502.html https://blog.csdn.net/huwentao_totti/article/deta ...

  10. Java浅拷贝和深拷贝(一文足矣),及String类型的坑。

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/q258523454/article/d ...

最新文章

  1. mysql h 127.0.0.1_MySQL 连接时尽量使用 127.0.0.1 而不是 localhost
  2. springcloud 子项目怎么导入_使用eclipse一步一步创建SpringCloud项目(二)—— 使用feign和ribbon调用微服务...
  3. tf.keras.losses.Poisson 损失函数 示例
  4. matlab神经网络 时间序列,请问吧里有大神做过MATLAB时间序列神经网络(NARX)吗?...
  5. wxWidgets:wxRichTextCtrl类用法
  6. hdu 2444(二分图的判断以及求最大匹配)
  7. 配置docker阿里云镜像加速
  8. minecraftjava版光追_《我的世界》加入光追,“马赛克”游戏真有必要这样做?...
  9. C#编写IE插件的一些经验
  10. IP协议(IP协议报头、MTU、网段划分、NAT技术、路由的工作过程)
  11. 使用命令行查看Windows系统激活信息
  12. 科研难做,何不使用Nvivo?
  13. office教程:如何给excel表格重命名工作表
  14. docker安装mysql 并挂载目录
  15. fastdb c++接口
  16. canvas动画 时钟动画 太阳系动画 动态蚂蚁线 全景照片
  17. C++ string 简单截取字符串使用
  18. Flutter黑马头条项目开发(二.底部切换导航和新闻页面开发)
  19. 综合案例----学生管理系统
  20. 如何关闭或更改Windows自带输入法繁体简体切换(Ctrl+Shift+F)的快捷键

热门文章

  1. 杭州的海王星辰将健美生的保健品全部突然下架拉,有谁知道是什么
  2. tyvj 火焰巨魔的惆怅
  3. Win 10 + VMware Workstation Pro15 + Ubuntu 18.04 虚拟机安装教程
  4. 把图片变成语音怎么弄?快来看看这篇文章
  5. 交接读代码得过程和整理文档
  6. 第三届全国中医药院校大学生程序设计竞赛(部分题解)更新中~
  7. 【C语言】万字讲解 从零到精通 (文件操作与文件函数)
  8. HiveOnSpark
  9. 九龙证券|AI重塑半导体基础设施,人工智能发展持续加速
  10. chrom浏览器flash_谷歌浏览器怎么打开flash_最新版chrome怎么开启flash-win7之家