Java基础随笔-System.arraycopy()方法使用心得

首先这个方法的格式如下:

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

这个是源代码里面的格式,其中的意思是:
1:Object src:这个代表源数组
2:int srcPos:这个代表复制时要从源数组的什么位置开始
3:Object dest:这个是目标数组,就是我们要把数组复制到这个数组
4:int destPos:这个代表你要把要复制的内容从到目标数组的什么位置开始
5:int length:这个就是源数组要把多长的长度复制到目标数组

综上所述,我们可以知道这个就是用来复制一个数组的
先附上一段核心技术卷的源代码(其中涉及反射等知识点)

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * ClassName:CopyOfTest
 * Author:LFM
 * Date:2019/6/14 12:35
 **/
public class CopyOfTest {
    public static void main(String[] args) {
        int [] a = {1,2,3,4,5,6};//定义一个整型数组
        a = (int[]) goodCopyOf(a,10);
        System.out.println(Arrays.toString(a));

        String [] b = {"Tom","Dick","Harry"};
        b = (String[]) goodCopyOf(b,10);
        System.out.println(Arrays.toString(b));

        System.out.println("这个方法会抛出一个异常:");
        b=(String[])badCopyOf(b,10);
    }
    /**
     *@author LFM
     *@Description 利用这个方法进行数组的复制会抛出异常
     *@date 2019/6/14
     */
    public static Object[] badCopyOf(Object[] a,int newLength){
        Object[] newArray = new Object[newLength];
        System.arraycopy(a,0,newArray,0,Math.min(a.length,newLength));
        return newArray;
    }
    public static Object goodCopyOf(Object a,int newLength){
        Class c1 = a.getClass();
        if (!c1.isArray()) return null;//首先确定是一个数组
        Class componentType = c1.getComponentType();//使用Class类的getComponentType()方法确定数组类型
        int length = Array.getLength(a);
        Object newArray = Array.newInstance(componentType,newLength);
        System.out.println(length);
        System.out.println(newLength);
        System.arraycopy(a,0,newArray,0,Math.min(length,newLength));
        return newArray;
    }

}

运行结果如下:
在这里插入图片描述
分别解释一下结果的内容:
6是源数组的长度,10是目标数组的长度,至于结果为什么有0和null,是因为调用Class类的
getComponentType方法得到类型后又调用.newInstance()方法生成一个数组,里面对不同的类型的
数组给予了默认赋值(int 为0,String为null)。
最后收一下为什么长度那里用一个Math.min()方法,这个是保证如果源数组的长度比目标数组小,那就只要目标数组规定长度的内容,如果比他大,那就用源数组的内容替换目标数组从0开始的那部分长度的内容。
还有一个异常问题的原因是int[]类型的数组可以覆盖Object[],但是不能反过来,因为Object数所有类的超类,可以这么理解,就是子类可以覆盖超类,而超类不能覆盖子类,这里就是想用Object[]类型覆盖int[]类型,所以出现了类型不匹配的异常。

猜你喜欢

转载自blog.csdn.net/weixin_42341232/article/details/91973510