由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.pswp.cn/news/257592.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257592.shtml
英文地址,請注明出處:http://en.pswp.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。于是想換一個開發環…