1. 程式人生 > >Java陣列物件的深拷貝

Java陣列物件的深拷貝

ArrayList<Cell> cells = ArrayList<Cell>();
ArrayList<Cell> init_cells = new ArrayList<Cell>();
init_cells = (ArrayList<Cell>) cells.clone();
執行以下的測試程式碼:
System.out.println(init_cells.get(0).name);
cells.get(0).name = "aaaaaaaa";
System.out.println(init_cells.get(0).name);

對於陣列物件來說,直接對陣列進行復制,雖然開闢了new了空間,但是因為陣列中存的物件是引用資料型別,所以複製的時候也只是複製的引用。

物件陣列深拷貝失敗 
解決方法: 
1.將需要深拷貝的物件實現Cloneable介面 

2.對物件陣列中的每一個物件進行深拷貝。即對每一個數組中的物件進行clone

3、因為object的clone是protected的,只能對本包或者繼承類暴露這個方法,所以物件型別要實現Cloneable的介面,才能重寫Clone方法。

在Cell.java中實現Cloneable介面

public class Cell implements Cloneable {
    public Object clone() {
        Cell o = null;
        try {
            o = (Cell) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }
}

然後遞迴對陣列中的物件進行clone,並將clone的返回物件新增到新的陣列中

public static void deep_clone(ArrayList<Cell> clone_cells){
    for(Cell c : cells){
            clone_cells.add((Cell) c.clone());
        }
}
deep_clone(init_cells);
System.out.println(init_cells.get(0).name);
cells.get(0).name = "aaaaaaaa";
System.out.println(init_cells.get(0).name);

相關推薦

js 陣列物件拷貝

結論:物件的拷貝不能採用直接賦值的方式。 背景 踩過的坑如下: formData本來是父元件傳過來的,但是我不想直接用,於是我直接賦值給一個formDataCopy的物件。 但是詭異的事情發生了,就是在我填寫自己的表單元件的時候,一旦表單的資料發生的變化時,本來是formDataCopy的值發生變化,

Java陣列物件拷貝

ArrayList<Cell> cells = ArrayList<Cell>(); ArrayList<Cell> init_cells = new ArrayList<Cell>(); init_cells = (Array

java物件拷貝-

前幾天遇到一個需求,需要將java物件複製下,但是總是複製的引用。而不是隻複製物件的屬性值。如果物件還包含另一個物件。就更麻煩了。 package com.sunlands.community.common.entity; import java.io.*; public class T

js中物件陣列拷貝

通常我們對陣列、物件、物件陣列進行簡單賦值運算只是建立了一份原內容的引用,指向的仍然是同一塊記憶體區域,修改時會對應修改原內容,而有時候我們並不需要這種模式,這就需要對內容進行深拷貝。 一、陣列的深拷貝 方法1:遍歷複製 var arr = ["a", "b"], arrCopy = [

物件陣列拷貝

什麼是深拷貝和淺拷貝 1)深拷貝在計算機中開闢了一塊記憶體地址用於存放拷貝的物件, 2)而淺拷貝僅僅是指向被拷貝的記憶體地址,如果原地址中物件被改變了,那麼淺拷貝出來的物件也會相應改變。 深拷貝和淺拷貝最根本的區別在於是否是真正獲取了一個物件的拷貝實體,而不是引用。 物

javascript關於物件拷貝陣列去重的問題...

中秋最後一天假期,還是憋屈在家裡,沒事可做,發發關於兩個看似很基礎卻又很有意義的兩個問題的一點感想,如題... 一.物件深拷貝: 對應的淺拷貝,物件是通過地址指向來獲得引用的,所以單純的用一個新物件指向源物件就是淺拷貝,對新物件的操作同樣會影響的源物件。好比小明有個U盤,裡面裝有一些資料,一天,小紅也需要這

一行程式碼完成js物件陣列拷貝

1、對於普通陣列(陣列元素為數字或者字串),深拷貝很簡單,拷貝之後兩個陣列指標指向的儲存地址不同,從而完成深拷貝 var _test = [1,2,3];//原陣列 var _testCopy = [].concat(_test);//拷貝陣列 _testCopy[0]=4

Java 使用protostuff實現快速的物件拷貝

首先protostuff是谷歌開源的一個序列化工具,比Java內部提供的序列化方式要快很多倍,然後深拷貝的時候特別是對於一個pojo我還要把它所有的引數都要寫一遍?程式猿?碼農?當然不會!所以我們考慮一下序列化吧。 事情的起因是對shiro操作的時候,服務層通

Java中的拷貝(復制)和淺拷貝(淺復制)

alt public min import containe long serializa port nbsp 深拷貝(深復制)和淺拷貝(淺復制)是兩個比較通用的概念,尤其在C++語言中,若不弄懂,則會在delete的時候出問題,但是我們在這幸好用的是Java。雖然java

淺談Java中的拷貝和淺拷貝

detail tle pac err @override 復制對象 deep har 間接   淺談Java中的深拷貝和淺拷貝(轉載) 原文鏈接: http://blog.csdn.net/tounaobun/article/details/8491392 假如說你想復制一

JS--使用slice和concat對陣列拷貝和淺拷貝

一、陣列淺拷貝 在使用JavaScript對陣列進行操作的時候,我們經常需要將陣列進行備份. 如下程式碼,如果只是簡單才用賦值的方法,那麼我們只要更改其中的任何一個,然後其他的也會跟著改變,這就導致了問題的發生 var arr1 = ["red","yellow","black"]; v

Javascript中物件拷貝的應用

javascript中的物件的深拷貝 關於Javascript的物件的深淺拷貝網上有很多的說明文件。 詳見:js深拷貝和淺拷貝 下面說明下我遇到的業務場景,由於框架的限制,在每次開啟模態頁面的時候,框架會自動將我賦予模態頁面的物件的屬性改變,而框架對於屬性的名稱是嚴格要求的。

實現物件拷貝的簡單案例

程式碼 function deep() { var length = arguments.length; if (length <= 2) { if (length === 1) { retur

物件拷貝函式封裝

function deepClone(obj){ let objClone = Array.isArray(obj)?[]:{}; if(obj && typeof obj==="object"){ for(key in obj){

物件拷貝和淺拷貝

寫在前面 各類技術論壇關於深拷貝的部落格有很多,有些寫的也比我好,那為什麼我還要堅持寫這篇部落格呢,之前看到的一篇部落格中有句話寫的非常好 學習就好比是座大山,人們沿著不同的路登山,分享著自己看到的風景。你不一定能看到別人看到的風景,體會到別人的心情。只有自己去登山,才能看到不一樣的風景,體會才更加

JS實現二維陣列拷貝及外掛程式碼

深拷貝與淺拷貝的介紹 在寫程式碼前先簡短介紹下JS中淺拷貝與深拷貝的區別。 JavaScript中有兩種型別的物件拷貝:淺拷貝(Shallow Copy)、深拷貝(Deep Copy): 深複製和淺複製最根本的區別在於是否是真正獲取了一個物件的複製實體,而不是引用。 淺拷貝——只是拷貝了

iOS 深入瞭解自定義物件 拷貝,多層次拷貝

關於iOS的深拷貝,淺拷貝已經有很多文章,不必在過多贅述。有關係統常見可變物件和不可變物件的copy 和 mutableCopy網上有很多文章,一張圖基本上可以說明那麼本文著重要研究的是自定義物件的拷貝問題,特別比如說自定義物件裡面有屬性可以一、物件持有另一個本類的例項物件,

Java中的拷貝與淺拷貝(一)

概述 JAVA中物件的拷貝分兩種:深拷貝和淺拷貝。 物件的拷貝在記憶體中的體現即是在堆中新開闢一片空間,然後將要拷貝的物件拷貝一份到新開闢的空間上來。要拷貝的物件可能有各種基本資料型別的成員變數,也可

js物件拷貝

前置知識 基本型別和引用型別   基本型別:存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小可以分配。   5種基本資料型別有Undefined、Null、Boolean、Number 和 String,它們是直接按值存放的,所以可以直接訪問。

JAVA如何實現拷貝

protected 域(或方法)微妙的規則 protected 域(或方法)對本包內的所有類可見(當然包括子類),那麼,子類可以獲得訪超類受保護域(或方法)的權利,但是,若子類和超類不在同一個包下,就不能訪問超類物件的這個受保護域(或方法)。也就是說,不在一個包下,子類中不