Understand array copy in seconds, perceive new realm

1. Preface I recently encountered the problem of array copying. I have never thought about it before. Arrays still use copying?

Before today, the editor used the method of cyclic assignment to copy the array, the speed will be slower, the code looks very low, and it is not recommended.

Today, I will take this opportunity to summarize a wave and share it with you.

Second, System.arraycopy and Arrays.copyOf (shallow copy)

This is a method provided by System, and it is also a copy method I recommend. It is a shallow copy. For non-basic types, it copies the reference of the object instead of creating a new object. This method is not written in Java. Yes, the bottom layer is implemented in C or C++, and the speed is relatively fast.

Through source code analysis, Arrays.copyOf is a shallow copy.

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;
   }
}

In fact, it still calls System.arraycopy, so it is also a shallow copy.

1, basic type array copy

package com.guor.test.javaSE.collection;
 
import java.util.Arrays;
 
import com.guor.test.User;
 
public class ArrayTest {
 
	public static void main(String[] args) {
		beanCopy();
	}
	
	//**************************************************************
	private static void copySelf() {
		int[] ids = { 1, 2, 3, 4, 5 };  
		System.out.println(Arrays.toString(ids));
		//System.arraycopy(src, srcPos, dest, destPos, length);
		// 把从索引0开始的2个数字复制到索引为3的位置上  
		System.arraycopy(ids, 0, ids, 3, 2);
		System.out.println(Arrays.toString(ids));//[1, 2, 3, 1, 2]
	}
	
	private static void copyToOther() {
		int[] ids = { 1, 2, 3, 4, 5 };  
		//将数据的索引1开始的3个数据复制到目标的索引为0的位置上  
		int[] other = new int[5];
		System.arraycopy(ids, 1, other, 0, 3);
		System.out.println(Arrays.toString(ids));//[1, 2, 3, 4, 5]深复制
		System.out.println(Arrays.toString(other));//[2, 3, 4, 0, 0]
	}
}

2. Object array copy

//如果是类型转换问题,获取整形
private static void getIntegerArrayFromObjectArray() {
    Object[] obj1 = { 1, 2, 3, "4", "5" };
    Integer[] obj2 = new Integer[5];
 
    try {
        System.arraycopy(obj1, 0, obj2, 0, obj1.length);
    } catch (Exception e) {
        System.out.println("transfer exception:"+e);
    }
    System.out.println(Arrays.toString(obj1));
    System.out.println(Arrays.toString(obj2));
}
 
//获取Object数组中的字符串类型数据
private static void getStringArrayFromObjectArray1() {
    Object[] obj3 = { 1, 2, 3, "4", "5" };
    String[] obj4 = new String[5];
    try {
        System.arraycopy(obj3, 2, obj4, 2, 3);
    } catch (Exception e) {
        //transfer exception:java.lang.ArrayStoreException
        System.out.println("transfer exception:"+e);
    }
    System.out.println(Arrays.toString(obj3));
    //[null, null, null, null, null]
    System.out.println(Arrays.toString(obj4));
}
 
//获取Object数组中的字符串类型数据
private static void getStringArrayFromObjectArray2() {
    Object[] obj3 = { 1, 2, 3, "4", "5" };
    String[] obj4 = new String[5];
    try {
        System.arraycopy(obj3, 3, obj4, 3, 2);
    } catch (Exception e) {
        System.out.println("transfer exception:"+e);
    }
    System.out.println(Arrays.toString(obj3));
    //[null, null, null, 4, 5]
    System.out.println(Arrays.toString(obj4));
    obj3[3] = "zhangssan";
    System.out.println("查看是浅复制还是深复制~~~~~");
    System.out.println(Arrays.toString(obj3));
    System.out.println(Arrays.toString(obj4));
}

3. Multidimensional array copy

//多维数组
public static void twoArray() {
    int[] arr1 = {1, 2};
    int[] arr2 = {3, 4};
    int[] arr3 = {5, 6};
 
    int[][] src = new int[][]{arr1, arr2, arr3};
 
    print("原始模样:", src);
    int[][] dest = new int[3][];
    System.arraycopy(src, 0, dest, 0, 3);
 
    System.out.println("改变前");
    print("src = ", src);
    print("dest = ", dest);
 
    //原数组改变后观察新数组是否改变,改变->浅复制,不改变->深复制
    src[0][0] = -1;
 
    System.out.println("改变后");
    print("src = ", src);
    print("dest = ", dest);
}

4, object array copy

//对象复制
private static void beanCopy() {
    User user1 = new User("zs",18);
    User user2 = new User("ls",18);
    User user3 = new User("ww",18);
    User[] userArraySrc = {user1, user2, user3};
    User[] userArrayDest = new User[3];
    System.out.println("对象复制,原始模样:"+Arrays.toString(userArraySrc));
    System.arraycopy(userArraySrc, 0, userArrayDest, 0, userArraySrc.length);
    System.out.println("userArrayDest," + Arrays.toString(userArrayDest));
    System.out.println("------------改变原对象------------------");
    userArraySrc[0] = new User("su",20);
    System.out.println("***" + Arrays.toString(userArraySrc));
    System.out.println("***" + Arrays.toString(userArrayDest));
}
 
//二维数组toString()
private static void print(String string, int[][] arr) {
    System.out.print(string);
    for (int[] a : arr) {
        for (int i : a) {
            System.out.print(i + " ");
        }
        System.out.print(",");
    }
    System.out.println();
}

3. clone()

protected native Object clone() throws CloneNotSupportedException;

clone() is also a native method, so it is also implemented in C language.

1. The basic array type clone()

2. Object array clone()

 

Everyone [ like , favorite, follow, comment ], if you are interested, you can find me and send it to you.

Pay attention to the [Nezha Learn Java] public account, three Java technology sharing articles every week, full of dry goods!

 

 

{{o.name}}
{{m.name}}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324140151&siteId=291194637