JDK源码阅读之数组拷贝

JDK提供了一个class java.util.Arrays来进行数组的相关操作,,其中数组的拷贝copyOf()方法在集合中被频繁地使用,该方法将一个源数组original中newLength长度的内容拷贝到一个新的数组中,并返回这个新的数组,这个新数组的长度为newLength。

    public static  T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }

在内容拷贝上,直接使用了System.arraycopy方法来拷贝内存数据,System.arraycopy比用for循环拷贝数据要快,避免可数据的寻址过程而是直接进行内存拷贝,这样更加快速,这里也说明了System.arraycopy和Arrays.copyOf()的区别,Arrays.copyOf()会产生新的数组而System.arraycopy则不会。

    public static  T[] copyOf(U[] original, int newLength, Class newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

上面代码有两个地方让人疑惑:
1.为什么要对Class对象的进行Object强制转换

进行强制转换的原因是在进行==比较的class对象的时候,需要两边的类一个是另一个类的父类,或者相同的类,虽然Object[].class是所有数组类型的父类,但并不是泛型数组Class的父类,泛型的情况比较复杂,需要进行强制转换才能进行比较。

2.会什么不直接使用Array.newInstance兼容两种场景

因为Array.newInstance使用到了反射,反射的有一定的性能消耗,所以能够确定是Object数组就用常规的方式构建数组,而Class不能够确定其具体类型,只有动态确定,所以只能够用Array.newInstance。

参考:
System:System.arraycopy方法详解
Do not understand the source code of Arrays.copyOf

你可能感兴趣的:(JDK源码阅读之数组拷贝)