1. 程式人生 > >陣列的四種複製方法

陣列的四種複製方法

java陣列拷貝主要有四種方法,分別是迴圈賦值,System.arraycopy(),Arrays.copyOf()(或者Arrays.copyOfRange)和clone()方法。下面分別介紹一下這幾種拷貝。

迴圈拷貝(速度相對比較慢)

迴圈拷貝其實沒什麼好說的啦,就是用一個for迴圈進行元素的逐個拷貝,進行深拷貝或者淺複製這個大家可以自己把握。

System.arraycopy(淺拷貝)

這個是系統提供的拷貝方式,也是我們推薦使用的拷貝方式,它是淺拷貝,也就是說對於非基本型別而言,它拷貝的是物件的引用,而不是去新建一個新的物件。通過它的程式碼我們可以看到,這個方法不是用java語言寫的,而是底層用c或者c++實現的,因而速度會比較快。

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

通過原始碼我們可以看到,關鍵字native說明它不是用java語言寫的,而是呼叫其他語言的程式碼。

Arrays.copyOf(淺拷貝)

這個方法也是淺拷貝,為什麼呢?我們看一下它的原始碼就知道了。

public static byte[] copyOfRange(byte[] original, int from, int to) {                   
   int
newLength = to - from; if (newLength < 0) throw new IllegalArgumentException(from + " > " + to); byte[] copy = new byte[newLength]; System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); return copy; }

實際上它呼叫的就是System.arraycopy,所以肯定也是淺拷貝。

Object.clone

clone()比較特殊,對於物件而言,它是深拷貝,但是對於陣列而言,它是淺拷貝。

物件拷貝

首先講一下物件的拷貝,它是深拷貝,大家可以用物件去測試一下。下面我們看一下它的原始碼:

protected native Object clone() throws CloneNotSupportedException;

這裡也有native關鍵字,所以也是底層的c語言實現的。
還要注意的是,這裡修飾符是protected,也就是說,我們建立了一個Object類以後,是不能直接呼叫這個clone()方法的,因為protected關鍵字只允許同一個包內的類和它的子類呼叫,所以我們宣告一個object類時,肯定不是同一個包內,所以就不能去呼叫它。

要呼叫這個方法,就需要我們寫一個類,然後宣告實現cloneable介面就好了,不需要去顯示地宣告繼承於object,因為java中的類如果不顯示說明父類的話,預設父類就是object。然後我們繼承這個方法:

@Override
    public Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }

這裡需要是,為了能夠在不同包內去呼叫這個方法,我們需要把這個許可權升級為public。現在我們就可以呼叫這個類的clone()方法去拷貝我們的類了。

陣列拷貝

對於陣列而言,它不是簡單的將引用賦值為另外一個數組引用,而是建立一個新的陣列。但是我們知道,對於陣列本身而言,它它的元素是物件的時候,本來陣列每個元素中儲存的就是物件的引用,所以,拷貝過來的陣列自然而言也是物件的引用,所以對於陣列物件元素而言,它又是淺拷貝。我們用以下程式碼驗證一下:


class Aby implements Cloneable{
    public int i;
    public Aby(int i) {
        this.i = i;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }
}

public class Solution {

    public static void main(String[] args) throws CloneNotSupportedException {
        Aby aby1 = new Aby(1);
        Aby aby2 = (Aby) aby1.clone();
        aby1.i = 2;
        System.out.println(aby1.i); //2
        System.out.println(aby2.i); //1

        Aby[] arr = {aby1,aby2};

        Aby[] arr2 = arr.clone();
        arr2[0].i = 3;
        System.out.println(arr[0].i);   //3
        System.out.println(arr2[0].i);  //3
    }
}

相關推薦

陣列複製方法

java陣列拷貝主要有四種方法,分別是迴圈賦值,System.arraycopy(),Arrays.copyOf()(或者Arrays.copyOfRange)和clone()方法。下面分別介紹一下這幾種拷貝。 迴圈拷貝(速度相對比較慢) 迴圈拷貝其實沒什麼好說的啦,就是用

java陣列拷貝方法的效能分析:for、clone、System.arraycopy、Arrays.copyof

今天作者就Java陣列的拷貝方法進行效能比較,多有不足,請大家指正!!! 1.for方法,用迴圈依次實現陣列元素的拷貝。 2.clone方法,是Object類的方法,用來實現物件的複製操作。 3.System.arraycopyof方法,是System的靜態方法,是一個na

Map遍歷常用方法

map.entry pri ext try set next() 方式 keys println Map常用四種遍歷方式 一:   Map<String,String> map = new HashMap<String,String>();

關於Facebook、twitter、google、pinterest分享方法,附帶微博、QQ、微信、豆瓣等等

設計 document 類型 默認 設計圖 sta over conf too   常用的國外網站分享推過,Facebook、twitter、google、pinterest這四種社交平臺最常見,下面就簡單介紹一下分享的方法。   首先,必須使用分享插件,share.js

使用CSS隱藏HTML元素的常用方法

style 被子 ie瀏覽器 display microsoft 頁面 AD city none CSS隱藏HTML元素的四種常用方法 1.opacity:設置opacity: 0可以使一個元素變得完全透明。 設置的透明度會被子元素繼承,而且無法取消。 通常可以使用opa

js 數組的深度拷貝 的實現方法

實現 個人總結 對象 () tro logs json 錯誤 深度拷貝 首先聲明本人資質尚淺,本文只用於個人總結。如有錯誤,歡迎指正、共同提高。 --------------------------------------------------------------

vue 引入方法

引用 .com png 不可 http 必須 bubuko inf vue 1.當引用時不加後綴名時,文件夾必須在node_modules的文件夾下,不可以npm下載 用於自定義的 2.可以npm下載 規定好的包 3. 加後綴名時並且沒在 node_modules文件夾時

Sandcastle方法生成c#.net幫助類幫助文檔

hive 完成 怎樣 tle 引入 util github 輸入 處理 方法一、Visual Studio新建documentation生成幫助文檔 前段時間在網上收集和自己平時工作總結整理了《幹貨,比較全面的c#.net公共幫助類》,整理完成上傳git

U盤強制拔出丟失數據的恢復方法(U盤寫保護的解決方法

沒有 文件 生成列 灰色 下載 而且 tool 需要 大小 ● U盤強制拔出丟失數據的恢復方法 U盤從出現以來,小巧便攜容量大深受人們的喜愛,不用像雲盤一樣需要下載,所以重要的文件我們都喜歡用U盤來傳遞數據,但是很多人使用U盤拔出時都沒有使用“彈出U盤”功能,取出過程中電腦

類的定義方法

// 工廠模式 function Car(name, color, price) { var tempcar = new Object; tempcar.name = name; tempcar.color = color; tempcar.price = price; tempcar.getCar

多執行緒的實現方法

Java多執行緒實現方式主要有四種:繼承Thread類、實現Runnable介面、實現Callable介面通過FutureTask包裝器來建立Thread執行緒、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。 其中前兩種方式執行緒執行完後都沒

Python資料視覺化的簡易方法

摘要: 本文講述了熱圖、二維密度圖、蜘蛛圖、樹形圖這四種Python資料視覺化方法。 資料視覺化是任何資料科學或機器學習專案的一個重要組成部分。人們常常會從探索資料分析(EDA)開始,來深入瞭解資料,並且建立視覺化確實有助於讓問題更清晰和更容易理解,尤其是對於那些較大的高維度資料集。在專

Python數據可視化的簡易方法

陰影 cat 一點 代碼 概率分布 man sda stat word 摘要: 本文講述了熱圖、二維密度圖、蜘蛛圖、樹形圖這四種Python數據可視化方法。 數據可視化是任何數據科學或機器學習項目的一個重要組成部分。人們常常會從探索數據分析(EDA)開始,來深入了解數據

面試常考演算法題(一)--排序方法以及小和問題

常用演算法題練習(一) 引言 演算法的重要毋庸置疑,在面試過程中或多或少的會被問到演算法,這一個系列的文章雖然冠以常用這一稱呼,但是並不意味著所有演算法都很簡單,這一篇文章是系列文章的第一篇,包括以下幾個演算法題,部分相對而言有點難度的題目會有所講解. 氣泡

selenium報錯Element is not clickable at point及解決方法

使用Selenium時,觸發點選事件,經常報如下異常: Element is not clickable at point   1、未載入 沒加載出來就等待元素加載出來,再往下執行。 可以使用python庫time 不過最好還是使用selenium自帶WebDriver

用R語言實現對不平衡資料的處理方法

https://www.weixin765.com/doc/gmlxlfqf.html 在對不平衡的分類資料集進行建模時,機器學**演算法可能並不穩定,其預測結果甚至可能是有偏的,而預測精度此時也變得帶有誤導性那麼,這種結果是為何發生的呢?到底是什麼因素影響了這些演算法的表現?   在不平衡的

微信聊天記錄怎麼恢復,恢復方法等你學

微信聊天記錄怎麼恢復?在如今的網路時代,微信已經滲透到我們現實生活當中,在微信中也有很多聊天記錄也不僅僅是情感象徵了,在我們不開心時還能開啟聊天記錄去看看以前的聊天美好時刻,也會有很多比較重要的資訊留存在聊天記錄裡面,那麼如果這些聊天記錄刪除了該怎麼該怎麼辦呢?

spring與mybatis整合方法

1、採用資料對映器(MapperFactoryBean)的方式,不用寫mybatis對映檔案,採用註解方式提供相應的sql語句和輸入引數。   (1)Spring配置檔案: <!-- 引入jdbc配置檔案 --> <context:p

組合數C(n,m)的求解方法

ons 避免 art main src vector 記錄 display ace 轉自:文章 1、暴力求解 C(n,m)=n*(n-1)*...*(n-m+1)/m!,(n<=15); int CF(int n,int m) { int ans=1,i,j

height:100%; 不起作用的解決方法,子級溢位來父級卻沒有撐開

專案中遇到一個問題: 父級高度是auto,子級高度100%但是元素卻無法撐滿,總結了一下有下面三種方法,親測有效: 1:給父元素設為塊級並加固定高度 2: 父元素height:auto; overflow:hidden; 3: 不苛求相容性的話父級dis