java陣列的四種拷貝方式
阿新 • • 發佈:2018-11-11
拷貝陣列方式 | 深拷貝/淺拷貝 | 是否產生新的物件 | 備註 |
---|---|---|---|
for迴圈拷貝 | 淺拷貝 | 否 | 拷貝速度最慢 |
clone拷貝陣列 | 淺拷貝 | 會產生新的物件(Object型別的物件) | |
System.arraycopy | 淺拷貝 | 否 | 本地方法(native修飾,c/c++程式碼實現,呼叫執行速度非常快) |
Arrays.copyOf | 淺拷貝 | 返回一個數組(拷貝什麼型別返回什麼型別) | 底層呼叫System.arraycopy |
它們都是淺拷貝,但對於基本資料型別來說可以理解為是深拷貝,對於引用型別來說是淺拷貝,它們拷貝的是引用,和被拷貝的引用指向同一個物件。
四種引用簡單應用程式碼:
public class TestDemo6 { public static void main(String[] args) { for_copy(); clone_copy(); arraycopy_copy(); ArrayscopyOf_copy(); } /** * for迴圈拷貝陣列 */ public static void for_copy() { //一維陣列的拷貝 int[] array1={1,2,3,4,5,6,7}; int[] array2=new int[array1.length]; for(int i = 0;i < array1.length;i++){ array2[i] = array1[i]; } System.out.println(Arrays.toString(array2)); //二維陣列的拷貝 int[][] array3= {{1,2,3},{4,5,6}}; int[][] array4 = new int[2][3]; for(int i = 0;i < array3.length;i++){ for(int j = 0;j < array3[i].length;j++){ array4[i][j] = array3[i][j]; } } System.out.println(Arrays.deepToString(array4)); } /** * clone拷貝陣列 */ public static void clone_copy() { //一維陣列的拷貝 int[] array1={1,2,3,5,9,8,7}; int[] array2=new int[array1.length]; array2=array1.clone(); System.out.println(Arrays.toString(array2)); //二維陣列的拷貝 int[][] array3={{1,2,3,4},{5,6,7}}; int[][] array4=new int[2][]; for(int i = 0;i < array3.length;i++){ array4[i] = array3[i].clone(); } for(int i=0;i<array3.length;i++){ System.out.print(Arrays.toString(array4[i])); } } /** * System.arraycopy拷貝陣列 */ public static void arraycopy_copy() { //一維陣列的拷貝 int[] array = {1,2,3,4,5}; int[] array2 = new int[array.length]; System.arraycopy(array, 0, array2, 0, array.length);//(被複制的陣列,從幾號下標開始複製,複製到哪個陣列,複製到新陣列第幾號下標,複製長度) System.out.println(Arrays.toString(array2)); //二維陣列的拷貝 int[][] array1={{1,2,3,5,9},{2,3,36,5,7}}; int[][] array3=new int[2][5]; for(int i=0;i<array1.length;i++){ System.arraycopy(array1[i], 0, array3[i], 0, array1[i].length); } System.out.println(Arrays.deepToString(array3)); } /** * Arrays.copyOf拷貝陣列 */ public static void ArrayscopyOf_copy() { //一維陣列的拷貝 int[] array=new int[4]; System.out.println(Arrays.toString(array)); int[] array1 = new int[4]; array1 = Arrays.copyOf(array,array.length);//將陣列array拷貝到陣列brr,拷貝長度為array.length System.out.println(Arrays.toString(array1)); //一維陣列的拷貝 int[][] array2={{1,2,3,4},{2,6,7,5}}; int[][] array3=new int[2][4]; array3=Arrays.copyOf(array2, array2.length); System.out.println(Arrays.deepToString(array3)); } }