推薦學習:《》
利用迴圈對陣列進行拷貝很簡單,就是利用迴圈將要拷貝的陣列的元素逐個賦值給新的陣列。具體程式碼實現如下:
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方法底層的原碼:
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.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方法來實現的。我們來先看一下它底層的原碼
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這個方法,這個方法瞭解即可,程式碼實現如下:
public static void main(String[] args) { int[] arr = {1,2,3,4,5}; int[] copy = arr.clone(); }
這樣就拷貝完了,這種方法主要是產生了物件的一個副本,地址還是不一樣的。
推薦學習:《》
以上就是Java通過底層原碼瞭解陣列拷貝的詳細內容,更多請關注TW511.COM其它相關文章!