首頁 >Java >java教程 >Java透過底層原碼了解數組拷貝

Java透過底層原碼了解數組拷貝

WBOY
WBOY轉載
2022-07-22 16:42:591833瀏覽

本篇文章為大家帶來了關於java的相關知識,主要介紹了透過底層原碼了解數組拷貝的詳細分析,包括了循環對數組進行拷貝、Arrays.copyOf方法、 Arrays.copyofRange方法等等內容,下面一起來看一下,希望對大家有幫助。

Java透過底層原碼了解數組拷貝

推薦學習:《java影片教學

循環對數組進行拷貝

利用循環對數組進行拷貝很簡單,就是利用循環將要拷貝的陣列的元素逐個賦值給新的陣列。具體程式碼實作如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            copy[i] = arr[i];
        }
    }

這是我們一般會想到的方法,以下將一些JAVA為我們提供的一些比較方便的方法。

Arrays.copyOf方法

因為我是拷貝的整數數組,所以我用的就是拷貝整數陣列的Arrays.copyOf方法。也可以拷貝其它型別的數組,並不是只能拷貝整數數組。

下面就以拷貝整數陣列來講解Arrays.copyOf方法,我們先來看一下Arrays.copyOf方法底層的原碼:

public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

我們可以看到Array.copyOf方法的傳回值是是一個整數數組,而形參是有兩個參數,一個是整數數組,另一個是一個整數的變數。

形參中整數數組就是我們要拷貝數組的數組名

形參中的整數變數就是我們要拷貝數組的長度

因為是有返回價值的,所以我們在使用Arrays.copyOf方法的時候,要有陣列來接收回傳值。程式碼實作如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy =Arrays.copyOf(arr,arr.length);
    }

注意:拷貝的長度是可以超過要拷貝數組的長度的,如果超過了拷貝數組的長度的話,那麼多出來的元素值就為0;比如:我要拷貝arr數組,但是arr數組的大小為5,如果我在拷貝的時候,將arr.length*2了,那麼copy這個數組大小就是變成10,並且6~10個元素值為0.這也算是擴容。

Arrays.copyofRange方法

如果我們要拷貝部分陣列的一部分,就可以使用Arrays.copyRange這個方法。同上一樣,也是用拷貝整數數組進行講解,我們先看一下它底層的原碼:

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

我們透過Arrays.copyRange的原碼可以看到傳回值是一個整數型的數組,而形參是一個整數數組,兩個整數的變數。

形參中的整數數組就是要拷貝的數組的數組名

形參中的兩個整數變數from和to就是你要拷貝數組元素的範圍,注意這個範圍是[form,to)是左閉右開的,不包含to那個位置的元素。程式碼實作如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = Arrays.copyOfRange(arr,1,3);
    }

注意:陣列下標是從0開始的,1~3號的元素是指2,3,4.但是右邊是開區間,所以不包括4,因此copy這個數組知識拷貝了2和3這兩個元素。

System.arraycopy方法

然後我們來講一下System.arraycopy方法,其實細心的同學已經發現了,在前面兩個方法的原碼中都有System.arraycopy方法,他們的底層也是靠System.arraycopy方法來實現的。讓我們來先來看看它底層的原碼

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

System.arraycopy是看不到實現的原碼的,原因在於native,它的底層是C/C來實現的。但是native方法的優點就是執行速度非常快。程式碼實作如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = new int[arr.length];
        System.arraycopy(arr,0,copy,0,arr.length);
    }

此時拷貝的是arr整個數組,如果想要部分拷貝,可以透過改變形參來完成部分拷貝

clone方法

最後一個是數組名.clone這個方法,這個方法了解即可,代碼實現如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = arr.clone();
    }

這樣就拷貝完了,這種方法主要是產生了對象的一個副本,地址還是不一樣的。

推薦學習:《java影片教學

以上是Java透過底層原碼了解數組拷貝的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除