1. 程式人生 > >Java物件複製和陣列複製(拷貝)

Java物件複製和陣列複製(拷貝)

在實現原型模式時需要拷貝物件,於是……

淺拷貝:只複製一個物件,物件內部存在的指向其他物件陣列或者引用則不復制

深拷貝:物件,物件內部的引用均複製

物件拷貝

一、物件淺拷貝

Object類裡的clone方法是淺複製

1. 實現Cloneable介面,該介面沒有任何方法和欄位實現僅供標記使用。不實現會丟擲CloneNotSupportedException

2. 覆蓋clone方法,許可權設為public,並在方法內呼叫super.clone()

public class CloneTest {
    public static void main(String[] args) {
        Address address=new

Address();
        Student student = new Student();
        student.setAddress(address);
        Student student1=student.clone();
        System.out.println(student==student1);
        System.out.println(student.getAddress()==student1.getAddress());
    }
}


public class Address{
      private String addr

;
}


public class Student implements Cloneable{
    private int age;
    private String name;
    private Address address;
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address= address;
    }
    @OverridepublicStudent clone() {
      Student stu=null

;
        try {
            stu= (Student) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return stu;
    }
}

二、物件深拷貝

方法一:

覆蓋此物件的clone方法、覆蓋此對象內部的引用物件的clone方法,然後在此物件的clone方法內呼叫物件內部的引用物件的clone方法,並set進自己的欄位裡。

此項不寫,參考java.util.Date 的深複製clone

public Object clone() {
    Date d = null;
    try {
        d = (Date)super.clone();
        if (cdate!= null) {
            d.cdate = (BaseCalendar.Date)cdate.clone();
        }
    } catch (CloneNotSupportedException e) {}// Won't happenreturnd;
}

方法二:

使用Serializable介面

此物件以及所有需要複製的此物件內部所引用的物件都要實現Serializable介面,該介面沒有任何方法實現同樣僅供標記使用()

最好加上public static final long serialVersionUID=4545154351L;

只需覆蓋此物件的clone方法,許可權設為public,內部引用物件不需要覆蓋

public class CloneTest {
    public static void main(String[] args) {
        Address address=new Address();
        Student student = new Student();
        student.setAddress(address);
        Student student1=student.clone();

        System.out.println(student.getAddress()==student1.getAddress());
    }
}

import java.io.Serializable;
public class Address implements Serializable{
    public static final long serialVersionUID=4545154351L;
    private String addr;
}

import java.io.*;

public class Student implements Serializable{
    public static final long serialVersionUID=45451511351L;
    private int age;
    private String name;
    private Address address;
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address= address;
    }
    @OverridepublicStudent clone() {
        Student stu=null;
        try {
            ByteArrayOutputStream byteArrayOutputStream=newByteArrayOutputStream();
            ObjectOutputStream objectOutputStream=newObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(this);
            ByteArrayInputStream bis=newByteArrayInputStream(byteArrayOutputStream.toByteArray());
            ObjectInputStream objectInputStream = newObjectInputStream(bis);
            stu= (Student) objectInputStream.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return stu;
    }
}

陣列拷貝

System.arraycopy() 淺拷貝

public static void arraycopy(Object src,  int srcPos,  Object dest,  int destPos,   int length)

從指定源陣列中複製一個數組,複製從指定的位置開始,到目標陣列的指定位置結束。

引數:

src - 源陣列。

srcPos - 源陣列中的起始位置。

dest - 目標陣列。

destPos - 目標資料中的起始位置。

length - 要複製的陣列元素的數量。

例如: 自我複製 刪除threads[i]元素

System.arraycopy(threads, i +1, threads, i, --nthreads- i);

Arrays.copyOfSystem.arraycopy的區別?大的區別是沒有的,因為Arrays.copyOf內部呼叫了System.arraycopy

詳細用法見

http://blog.csdn.net/csdn9988680/article/details/78160094

相關推薦

Java物件複製陣列複製拷貝

在實現原型模式時需要拷貝物件,於是…… 淺拷貝:只複製一個物件,物件內部存在的指向其他物件陣列或者引用則不復制 深拷貝:物件,物件內部的引用均複製 物件拷貝 一、物件淺拷貝 Object類裡的clone方法是淺複製 1. 實現Cloneable介面,該介面沒有任何方法和

全面理解java自動裝箱拆箱

sam eva android 之間 對象類型 output 壓力 有一個 sla 自動裝箱和拆箱從Java 1.5開始引入,目的是將原始類型值轉自動地轉換成對應的對象。自動裝箱與拆箱的機制可以讓我們在Java的變量賦值或者是方法調用等情況下使用原始類型或者對象類型更

Java中ArrayListLinkedList區別

java linked .com -s lan font array href spa 具體詳情參考原博客: http://pengcqu.iteye.com/blog/502676Java中ArrayList和LinkedList區別(轉)

Java抽象類接口

system args 程序 包含 多重 代碼 apt r.java 可擴展 ***************************接口********************************* 一.why 需求一直不變的時候可以不使用接口, 需求經常發生改變推薦使

Java程式設計師從笨鳥到菜鳥之一百零三java操作officepdf檔案java讀取word,excelpd

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

115個Java面試題答案——終極

本文我們將要討論Java面試中的各種不同型別的面試題,它們可以讓僱主測試應聘者的Java和通用的面向物件程式設計的能力。下面的章節分為上下兩篇,第一篇將要討論面向物件程式設計和它的特點,關於Java和它的功能的常見問題,Java的集合類,垃圾收集器,第二篇主要討論異常處理,J

java靜態代理動態代理

代理Proxy:  Proxy代理模式是一種結構型設計模式,主要解決的問題是:在直接訪問物件時帶來的問題。  代理是一種常用的設計模式,其目的就是為其他物件提供一個代理以控制對某個物件的訪問。代理類負責為委託類預處理訊息,過濾訊息並轉發訊息,以及進行訊息被委託類執行後的後續處理。 &

java郵件傳送簡訊傳送

最近剛完成一個任務-付款提醒郵件的傳送,對於java郵件的傳送有了更深刻的認識,的確java提供的郵件傳送機制的確讓郵件傳送這個問題變得靈活而又簡單。並且由於專案組其他人負責了簡訊的傳送,巧的是這個郵件傳送的藉口與簡訊傳送的藉口都被封裝到了訊息傳送的藉口,我也順便學習了一下

【46】java物件的三個特徵oop

物件的三個特徵: 物件的行為: 物件有哪些行為和方法 同一個類的例項,由於支援相同的行為具有家族式的特徵,物件的行為是由方法定義的。 物件的狀態: 施加方法時。物件的響應 每個物件都儲存

指標陣列陣列指標C

//注意指標陣列和陣列指標分別是如何指向二維陣列的#include <stdio.h>main(){    static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};/* 定義二維陣列m並初始化*/     int (*p)[4];//陣列指標  p是指標,指向

java資料結構演算法10

  這篇我們說說堆這種資料結構,其實到這裡就暫時把java的資料結構告一段落,感覺說的也差不多了,各種常見的資料結構都說到了,其實還有一種資料結構是“圖”,然而暫時對圖沒啥興趣,等有興趣的再說;還有排序演算法,emmm....有時間再看看吧!   其實從寫資料結構開始到現在讓我最大的感觸就是:新手剛開始還是不

物件的淺拷貝拷貝複製複製

淺拷貝(淺複製)        在C++中經常隱式或顯式的出現物件的複製。當兩個物件之間進行復制時,若複製完成後,它們還共享某些資源(記憶體空間),其中一個物件的銷燬會影響另一物件,這種物件之間的複製稱為物件的淺拷貝。C++中採用賦值運算子進行物件複製是預設的是淺拷貝。 #

javascript的深複製複製深度拷貝拷貝

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>js深度複製淺顯複製</title> </head>

Java物件的深複製複製

原文連結 我們在編碼過程經常會碰到將一個物件傳遞給另一個物件,java中對於基本型變數採用的是值傳遞,而對於物件比如bean傳遞時採用的引用傳遞也就是地址傳遞,而很多時候對於物件傳遞我們也希望能夠象值傳遞一樣,使得傳遞之前和之後有不同的記憶體地址,在這種情況下

java物件序列化與複製圖片

下面程式碼包括賦值多個圖片,物件的序列化,目的是將物件狀態存入檔案,再把物件狀態從檔案中讀取。 DataInputStream dis; DataOutputStream dos; FileInputStream fi = null;

JAVA語言基礎——陣列拷貝

一、問題解決 1.二分查詢 (1)int mid = (low + high)>>>1;//mid = (low + high) / 2位運算最快 (2)return -(low + 1);//查詢失敗,返回-(如果存在這個數將會在哪裡) (3)無須陣列:先排序後查詢

企業級Redis開發運維從入門到實踐 21— 全量複製部分複製

全量複製 對於一個儲存了很多資料的 master(主節點),slave(從節點)去做一個複製,想要的想過是把 master 的資料全部同步過來,在同步過程中 master 寫入的新資料也需要同步過來,這

Redis事務、持久化、主從複製、哨兵、JRedisJRedis Pool摘抄

事務是指一系列操作步驟,這一系列的操作步驟,要麼完全執行,要麼完全地不執行 Redis中的事務是一組命令的集合,至少是兩個或兩個以上的命令,redis事務保證這些命令被執行時中間不會被任何操作打斷 (1)multi標記一個事務的開始,事務內的多條命令會按照先後順序被放入一個佇列中,返回值總是

淺談物件的深複製複製的區別。

  場景   當你的元件裡需要用到同一個資料,但身負不同的責任。   舉個例子:vue的雙向繫結   你在與後端的互動中請求回來的資料,res,  let a = res; let b = res;  因為是會用到checkbox,在外層的列表裡選中資

JavaScript學習筆記物件 函式 陣列

1 物件 概述 生成方法 物件(object)是 JavaScript 語言的核心概念,也是最重要的資料型別。 什麼是物件?簡單說,物件就是一組“鍵值對”(key-value)的集合,是一種無序的複合資料集合。 var obj = { foo: ‘Hello’, bar: ‘Worl