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

Java物件陣列深拷貝

Java物件陣列深複製

1.今天做專案的時候遇到了一個java陣列深拷貝的問題,當時直接使用了Object物件的clone方法,結果不管用。

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);

結果輸出的結果是

c1
aaaaaaa

物件陣列深拷貝失敗
解決方法:
1.將需要深拷貝的物件實現Cloneable介面
2.對物件陣列中的每一個物件進行深拷貝

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);

在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; } }

最後輸出結果是:

c1
c1

相關推薦

Java物件陣列拷貝

Java物件陣列深複製 1.今天做專案的時候遇到了一個java陣列深拷貝的問題,當時直接使用了Object物件的clone方法,結果不管用。 ArrayList<Cell> cells = ArrayList<Cell>(); A

Java陣列物件拷貝

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

陣列物件拷貝

在實際開發中,如果遇到稍微複雜一點的邏輯,經常會遇到要複製物件或陣列的場景。而在複製之後,我們會發現改了副本,原物件或陣列的資料也相應改變了。這就是深拷貝的問題。 其原理涉及到記憶體,簡單來說,我們的淺拷貝就是新建一個變數,指向目標變數,而不佔用新的記憶體,所有一旦改變,就是直接改變的記憶體中的值,所以原來

java物件的淺拷貝拷貝

淺拷貝 java的資料型別有基本資料型別(如:int、long等)和引用資料型別。例如:物件1中有屬性a(基本資料型別)和屬性b(引用資料型別),在進行淺拷貝到物件2時,屬性a複製屬性的值給物件2,這樣物件1和物件2修改屬性a時不會相互影響。屬性b則是複製一份引用(即記憶體地址)給物件2,這樣物件1修改屬

JS 陣列以及物件拷貝總結

javascript 陣列以及物件的深拷貝(複製陣列或複製物件)的方法前言在js中,陣列和物件的複製如果使用=號來進行復制,那只是淺拷貝。如下圖演示:  如上,arr的修改,會影響arr2的值,這顯然在絕大多數情況下,並不是我們所需要的結果。 因此,陣列以及物件的深拷貝就是javascript的一個基本功了。

java 序列化實現物件拷貝

寫java程式碼時,經常要實現物件的clone方法,處理物件的深拷貝問題。有一種簡單的實現物件深拷貝的方法:將物件寫入到位元組流中,再讀出來即可實現深拷貝。 @SuppressWarnings("un

java 陣列拷貝 物件陣列拷貝 System.arraycopy函式

  /*java 陣列的操作   System類的arraycopy靜態函式用於陣列拷貝   陣列是不能越界的 物件陣列的複製實際上是複製的引用的拷貝  也就是物件的地址  */class Point{ int x; int y; Point(int x,int y) {  

陣列物件拷貝、淺拷貝

陣列的淺拷貝 首先看一下程式碼: let arr1=[1,3,3]; let arr2 = arr1; console.log(arr2);//[ 1, 3, 3 ] arr1[1]=8; console.log(arr2)//[ 1, 8, 3 ] 在

java拷貝陣列(拷貝)

假設陣列a,b。要把陣列a中的元素拷貝到b中,如果直接b = a的話。就會使b指向a的儲存區域,對b的修改也會引發a中元素的修改(淺拷貝)。public class ShallowCopy { public static void main(String[] args) {

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 假如說你想復制一

JAVA——物件陣列

物件陣列——非引用資料型別陣列 之前所定義的陣列都屬於基本型別的陣列,物件陣列往往是以引用資料型別為主的定義,例如:類、介面。 物件陣列往往是以引用資料型別為主。 具體使用方法如下: (一)動態初始化 類名稱[] 物件陣列名稱 = new 類名稱[長度] ; 需要標明陣列長度 舉例如下

使用JSON.parse(),JSON.stringify()實現對物件拷貝

  根據不包含引用物件的普通陣列深拷貝得到啟發,不拷貝引用物件,拷貝一個字串會新闢一個新的儲存地址,這樣就切斷了引用物件的指標聯絡。 測試例子: var test={ a:"ss", b:"dd", c:[ {dd:"css",ee:"c

結合多個例項深入理解js的拷貝和淺拷貝,多種方法實現物件拷貝

親們為什麼要研究深拷貝和淺拷貝呢,因為我們專案開發中有許多情況需要拷貝一個數組抑或是物件,但是單純的靠=“賦值”並不會解決所有問題,如果遇到引用型別的物件改變新賦值的物件會造成原始物件也發生同樣改變,而要去除影響就必須用到深拷貝,深拷貝,對於引用物件需要進行深拷貝才會去除影響。如果是值型別直接“=”

關於java物件陣列(全)

文章目錄 1 簡單物件陣列的構造與使用 1.1 Practice類 1.2 Student.java 1.3 關於簡單物件陣列的記憶體圖解 2 高階物件陣列::集合簡介 2.1 集合的由來及陣列的區別

js物件拷貝及其的幾種方法

深拷貝和淺拷貝是javascript中一個比較複雜的問題,也是面試官最喜歡問的問題之一,通過這個為可以看出是否入門,深拷貝和淺拷貝也是初學者經常犯錯一個點。 簡單來說深拷貝是拷貝儲存在棧中的物件,而淺拷貝是從記憶體中拷貝,這就涉及到資料存放位置了,總所周知,資料大體可以分為兩種資料型別,一種是基

python,可變物件,不可變物件拷貝,淺拷貝

學習整理,若有問題,歡迎指正。 python 可變物件,不可變物件 可變物件 該物件所指定的記憶體地址上面的值可以被改變,變數被改變後,其所指向的記憶體地址上面的值,直接被改變,沒有發生複製行為,也沒有發生開闢新的記憶體地址行為。 python可變物件有,列表,字典,set集合 列如:

利用MessageChannel實現物件拷貝

function deepClone(obj) { return new Promise(function(resolve, reject) { var { port1, port2 } = new MessageChannel(); port1.onme

Js中物件拷貝和淺拷貝

淺拷貝:只拷貝物件的基礎屬性值,對屬性值為物件或陣列的屬性則拷貝指標。  深拷貝:拷貝物件的所有屬性作為一個全新的物件。拷貝前後的物件互不影響。 淺拷貝僅僅是指向被複制的記憶體地址,如果原地址中物件被改變了,那麼深拷貝出來的物件也會相應改變。 一、物件引用 物件引用容易

Java:物件陣列的使用

物件陣列的使用 定義一個類。類名為物件陣列,包含兩個屬性。 含有無參和有引數兩種構造方法。 public class ObjectArr{ //定義屬性 private String name; private int age; //兩種構造方法