java:List的深拷贝
文章目录
- 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的深拷贝相关推荐
- 谈一谈Java中的深拷贝和浅拷贝
在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值.浅拷贝.深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存 ...
- java什么地方要用深拷贝,关于 Java 浅拷贝、深拷贝,你真的知道了吗?
这是今天我们在技术群里面讨论的一个知识点,讨论的相当激烈,由于对这一块使用的比较少,所以对这一块多少有些盲区.这篇文章总结了所讨论的内容,希望这篇文章对你有所帮助. 在 Java 开发中,对象拷贝或者 ...
- Java 浅拷贝、深拷贝,你知多少?
在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值.浅拷贝.深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存 ...
- Java 深入理解深拷贝和浅拷贝区别
title: Java 深入理解深拷贝和浅拷贝区别 date: 2021-6-19 updated: 2021-6-19 tags: Java 深拷贝和浅拷贝 categories: 面试 Java ...
- java 如何实现深拷贝
1.什么叫Java浅拷贝? 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝.如果属性是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是 ...
- java 深克隆(深拷贝)与浅克隆(拷贝)详解
java深克隆和浅克隆 基本概念 浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所拷贝的对象,而不复制它所引用的对 ...
- Java提高篇 —— Java浅拷贝和深拷贝
一.前言 我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性能 ...
- Java中的深拷贝(深复制)和浅拷贝(浅复制)
深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复 ...
- Java 浅拷贝和深拷贝的理解和实现方式
https://www.cnblogs.com/shakinghead/p/7651502.html https://blog.csdn.net/huwentao_totti/article/deta ...
- Java浅拷贝和深拷贝(一文足矣),及String类型的坑。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/q258523454/article/d ...
最新文章
- mysql h 127.0.0.1_MySQL 连接时尽量使用 127.0.0.1 而不是 localhost
- springcloud 子项目怎么导入_使用eclipse一步一步创建SpringCloud项目(二)—— 使用feign和ribbon调用微服务...
- tf.keras.losses.Poisson 损失函数 示例
- matlab神经网络 时间序列,请问吧里有大神做过MATLAB时间序列神经网络(NARX)吗?...
- wxWidgets:wxRichTextCtrl类用法
- hdu 2444(二分图的判断以及求最大匹配)
- 配置docker阿里云镜像加速
- minecraftjava版光追_《我的世界》加入光追,“马赛克”游戏真有必要这样做?...
- C#编写IE插件的一些经验
- IP协议(IP协议报头、MTU、网段划分、NAT技术、路由的工作过程)
- 使用命令行查看Windows系统激活信息
- 科研难做,何不使用Nvivo?
- office教程:如何给excel表格重命名工作表
- docker安装mysql 并挂载目录
- fastdb c++接口
- canvas动画 时钟动画 太阳系动画 动态蚂蚁线 全景照片
- C++ string 简单截取字符串使用
- Flutter黑马头条项目开发(二.底部切换导航和新闻页面开发)
- 综合案例----学生管理系统
- 如何关闭或更改Windows自带输入法繁体简体切换(Ctrl+Shift+F)的快捷键
热门文章
- 杭州的海王星辰将健美生的保健品全部突然下架拉,有谁知道是什么
- tyvj 火焰巨魔的惆怅
- Win 10 + VMware Workstation Pro15 + Ubuntu 18.04 虚拟机安装教程
- 把图片变成语音怎么弄?快来看看这篇文章
- 交接读代码得过程和整理文档
- 第三届全国中医药院校大学生程序设计竞赛(部分题解)更新中~
- 【C语言】万字讲解 从零到精通 (文件操作与文件函数)
- HiveOnSpark
- 九龙证券|AI重塑半导体基础设施,人工智能发展持续加速
- chrom浏览器flash_谷歌浏览器怎么打开flash_最新版chrome怎么开启flash-win7之家