由LintCode问题子集出发,浅析ArrayList的拷贝问题

在做LintCode上的递归类题目子集时,我一开始的想法是递归到最后一层即单元素时然后开始逐层返回,产生相应的每层的子集并添加到最终的结果中去。于是乎有了以下代码:

public List<List<Integer>> findSolution(int[] nums, int begin, int end){List<List<Integer>> result = new ArrayList<>();List<List<Integer>> pre_result = new ArrayList<>();List<Integer> temp = new ArrayList<>();temp.add(nums[end]);if(begin==end){result.add(temp);return result;}end--;pre_result = findSolution(nums,begin,end);result = new ArrayList<>(pre_result);end++;for(List<Integer> list:pre_result){list.add(nums[end]);Collections.sort(list);result.add(list);}result.add(temp);return result;}public List<List<Integer>> subsets(int[] nums) {// write your code hereList<List<Integer>> result = new ArrayList<>();if(nums.length>0){result = findSolution(nums,0,nums.length-1);}List<Integer> temp = new ArrayList<>();result.add(temp);return result;}

算法似乎很正确,每层返回处理的时候有一个pre_result和result两个List,其中result由new ArrayList<>(pre_result)进行复制。然后对pre_result进行遍历,将其中每个List的元素加上当前层的元素后加入到result中得到结果并返回。看起来似乎毫无破绽,然后我放心的在遍历pre_result时对其中的元素进行修改,但在提交的时候出现了问题,WA。然后我进行调试处理,以[1,2,3]为样例进行输入,在遍历的时候输出result和list,以下为输出结果:

list [1, 2]
result [[1, 2], [1, 2]]
list [1, 2, 3]
result [[1, 2, 3], [1, 2, 3], [2], [1, 2, 3]]
list [1, 2, 3, 3]
result [[1, 2, 3, 3], [1, 2, 3, 3], [2], [1, 2, 3, 3], [1, 2, 3, 3]]
list [2, 3]
result [[1, 2, 3, 3], [1, 2, 3, 3], [2, 3], [1, 2, 3, 3], [1, 2, 3, 3], [2, 3]]

对结果进行分析:在改变pre_result中的元素时,如果按之前的想法走,result中的元素不可能出现修改,也就是第一个result应该是 [[1], [1, 2]],但是结果却是[[1, 2], [1, 2]]。这极有可能是因为修改pre_result中的元素的时候result中的元素也跟着被修改掉了。这就说明new ArrayList<>()的拷贝是浅拷贝类型的,它只是一个引用的拷贝而非真正的对象的拷贝。当list在修改对象中内容的时候,result的值当然会发生变化。因此我对遍历这一过程的代码进行修改,以下为重写代码:

for(List<Integer> list:pre_result){List<Integer> temp_list = new ArrayList<>(list);temp_list.add(nums[end]);System.out.println("list "+list);System.out.println("temp_list "+temp_list);Collections.sort(temp_list);result.add(temp_list);System.out.println("result "+result);}

新建一个temp_list = new ArrayList<>(list),原以为以这种方式拷贝List也只是徒劳无功,修改了temp_list后list也会跟着改变。但没想到在测试的时候AC了,这就说明了list并未随着temp_list的元素增加而增加。然后我在遍历中输出temp_list和list这两个List,以下为结果:

list [1]
temp_list [1, 2]
result [[1], [1, 2]]
list [1]
temp_list [1, 3]
result [[1], [1, 2], [2], [1, 3]]
list [1, 2]
temp_list [1, 2, 3]
result [[1], [1, 2], [2], [1, 3], [1, 2, 3]]
list [2]
temp_list [2, 3]
result [[1], [1, 2], [2], [1, 3], [1, 2, 3], [2, 3]]

果然和我的猜测一致。但是从这一测试结果看仿佛ArrayList又不是简简单单的浅拷贝了,当temp_list在添加元素的时候并不对list造成影响。为了测试当list添加元素时会不会对temp_list造成影响我又在拷贝这一语句后加上了list.add(999),结果有以下输出:

list [1, 999]
temp_list [1, 2]
result [[1, 999], [1, 2]]
list [1, 999, 999]
temp_list [1, 999, 3]
result [[1, 999, 999], [1, 2], [2], [1, 3, 999]]
list [1, 2, 999]
temp_list [1, 2, 3]
result [[1, 999, 999], [1, 2, 999], [2], [1, 3, 999], [1, 2, 3]]
list [2, 999]
temp_list [2, 3]
result [[1, 999, 999], [1, 2, 999], [2, 999], [1, 3, 999], [1, 2, 3], [2, 3]]

这就说明了list元素的添加也不对temp_list造成影响。从以上的分析就可以得出对ArrayList拷贝类型的结论了:其应当介于浅拷贝与深拷贝之间。当用List<Integer> temp_list = new ArrayList<>(list)这一方式进行拷贝时,当前在list中的元素的拷贝方式为浅拷贝,只是拷贝一个引用而已。无论是在temp_list还是list中对这些旧元素进行操作时,两者均会受到影响,这是浅拷贝的概念;而在list或temp_list中添加或删除新元素时,它们两者互不干扰,这是深拷贝的概念。

转载于:https://www.cnblogs.com/Revenent-Blog/p/7458225.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大小端模式详解

http://www.cnblogs.com/xinsheng/archive/2012/04/18/2455039.html 端模式&#xff08;Endian&#xff09;的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类&#xff0c;从圆头开始将鸡蛋敲开的人被归为Big Endian&#xf…

.NET 跨平台服务端资料

OWIN Web API: http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api 用于写API的 OWIN SignalR: http://www.dotnetcurry.com/signalr/915/owin-katana-signalr-web-server 用于写即时通讯的转载于:https://www.cnblogs.com/Jarvin…

mysql的查询、子查询及连接查询

一、mysql查询的五种子句 where子句&#xff08;条件查询&#xff09;&#xff1a;按照“条件表达式”指定的条件进行查询。 group by子句&#xff08;分组&#xff09;&#xff1a;按照“属性名”指定的字段进行分组。group by子句通常和count()、sum()等聚合函数一起使用。 h…

BZOJ-1192-鬼谷子的钱袋

描述 鬼谷子非常聪明&#xff0c;正因为这样&#xff0c;他非常繁忙&#xff0c;经常有各诸侯车的特派员前来向他咨询时政。有一天&#xff0c;他在咸阳游历的时候&#xff0c;朋友告诉他在咸阳最大的拍卖行&#xff08;聚宝商行&#xff09;将要举行一场拍卖会&#xff0c;其中…

lamp 独立mysql_lamp or lnmp 环境搭建之独立安装mysql数据库

lamp or lnmp 环境搭建,如果mysql 是独立安装的则需要授权&#xff1a;单独一台服务器独立安装mysql安装后&#xff0c;优化服务器。授权实例如下&#xff1a;创建用户CREATE USER demo IDENTIFIED BY “passwd123”;授权使用mysql数据库下面的所有表GRANT ALL PRIVILEGES ON m…

item 24: 区分右值引用和universal引用

本文翻译自《effective modern C》&#xff0c;由于水平有限&#xff0c;故无法保证翻译完全正确&#xff0c;欢迎指出错误。谢谢&#xff01; 博客已经迁移到这里啦 古人曾说事情的真相会让你觉得很自在&#xff0c;但是在适当的情况下&#xff0c;一个良好的谎言同样能解放你…

WebLogic11g-常用运维操作

转自&#xff1a;https://dead-knight.iteye.com/blog/1940399 希望这篇能把weblogic运维时经常遇到的问题、常用的配置汇总到一起。 1、配置jvm参数&#xff1a; 一般在domain启动过程中会看到以下启动的日志信息&#xff0c;如下图所示&#xff1a; 图中红色方框部分为启动we…

牛腩新闻发布系统(一):SQLHelper重构(一)

导读&#xff1a;在机房重构的时候&#xff0c;就用到了SQLHelper&#xff0c;但那时候即使把代码反复看了很多遍&#xff0c;也看了注释&#xff0c;还和同学交流&#xff0c;也依然是半懂不懂。现在&#xff0c;我再次用到了SQLhelper这个东西&#xff0c;就来说说SQLHelper是…

OPENCV图像轮廓检测

前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像轮廓检测. 一.图像轮廓检测 在opencv中,轮廓对应着一系列的点的集合,open…

mysql 5.7.11 授权_mysql 5.7.11 安装配置教程

六步轻松搞定mysql5.7.11的安装1、下载安装包。mysql-5.7.11版本&#xff1a;2、拷贝到任意盘&#xff1a;例如&#xff0c;解压后拷贝文件夹至C盘&#xff1a;C:\Program Files\mysql。建议文件夹名字使用英文。3、配置环境变量&#xff1a;计算机—>右键—>高级系统设置…

iOS 面试之Block

转自&#xff1a;http://blog.csdn.net/xunyn/article/details/11658261 1 什么是block 对于闭包&#xff08;block),有很多定义&#xff0c;其中闭包就是能够读取其它函数内部变量的函数&#xff0c;这个定义即接近本质又较好理解。对于刚接触Block的同学&#xff0c;会觉得有…

当安全遇到大数据 “永恒之蓝”也将无所遁形!

文章讲的是当安全遇到大数据 “永恒之蓝”也将无所遁形&#xff01;5月12日&#xff0c;席卷全球的勒索病毒“永恒之蓝”让全世界都为之震动&#xff0c;这是迄今为止全球最大规模的勒索病毒网络攻击&#xff0c;100多个国家受到病毒感染&#xff0c;国内中石油、公安内网、高校…

[ES] 安装

1.ElasticSearch安装的准备工作 Linux&#xff1a;CentOS6.4 Elasticsearc:elasticsearch-2.2.0 JDK:jdk-7u79-linux-x64 IK:1.8.0 MAVEN:apache-maven-3.3.3-bin 2.配置网络静态文件 虚拟机设置桥接模式 配置&#xff1a;vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVIC…

语言基础之description方法

1.description方法的一般用处 1: // 指针变量的地址 2: NSLog("%p", &p); 3: // 对象的地址 4: NSLog("%p", p); 5: // <类名&#xff1a;对象地址> 6: NSLog("%", p); 1: Class c [Person class]; 2: …

亚信安全协助绿谷制药确保“秘方”安全

近几年&#xff0c;我国医药生物技术发展态势迅猛&#xff0c;加强知识产权保护己成为当务之急。为确保制药配方数据和生产管理信息系统安全&#xff0c;上海绿谷制药有限公司采用亚信安全服务器深度安全防护系统&#xff08;Deep Security&#xff09;和亚信安全防毒墙网络版&…

mysql判断叠字_格律诗的八大语法特点

古风的语法&#xff0c;本来就和散文的语法大致相同&#xff0c;直到近体诗&#xff0c;才渐和散文不同&#xff0c;原因是&#xff0c;首先在区区五字或七字之中&#xff0c;要施展丰富的想象&#xff0c;不能不力求简洁&#xff0c;凡可省去而不至于影响语意的字&#xff0c;…

旅游行业春节档期的大数据营销

本文讲的是旅游行业春节档期的大数据营销,虽然我国是以传统农耕文化为主导的社会&#xff0c;每逢春节讲究返乡团聚。但现代化的城市文明更是对很多人的生活方式产生了影响&#xff0c;特别是生活在大城市中的年轻人&#xff0c;以及由年轻人构成的小家庭来说&#xff0c;春节的…

openwrt lamp

https://applefreak111.wordpress.com/2013/03/12/howtoopenwrt-lamp-stack%E5%AE%89%E8%A3%9D/opkg update安裝Lighttpd, MySQL 5, 和PHP 5。opkg install lighttpd lighttpd-mod-cgi lighttpd-mod-fastcgivi /etc/lighttpd/lighttpd.confcgi.assign ( “.php” > “/usr/…

MySQL本天早上8点到明早8点_似乎找到 OSChina 早上 8 点钟容易宕机的原因

最近一段时间&#xff0c;OSChina 网站在早上 8 点出头的时候很容易因为数据库连接池爆满而导致网站宕机。表现的情况是数据库处理大量的查询&#xff0c;堆积大量并发连接&#xff0c;导致无法再连接到数据库&#xff0c;执行一个简单的查询速度也非常慢&#xff0c;数据库机器…

基于Eclipse搭建STM32开源开发环境

最近项目不忙&#xff0c;想着没事看看简单的嵌入式&#xff0c;弄弄物联网什么的。于是就从廉价的STM32开刀了。因为一直是做PC软件开发的&#xff0c;那VS的智能感知那叫一个爽啊&#xff0c;相比之下&#xff0c;觉得这个Keil简直就像文本编辑器一样low。于是想换一个开发环…