Arrays.copyOf()メソッドの詳細-jdk 1.8

14082 ワード

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> 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;
}

最終的に呼び出されたのはSystemであることがわかる.Arraycopy()メソッドは、このメソッドの使用について、Systemを表示することができる.arraycopyの詳細
1.方法の意味
T型の配列を返し、配列の容量はnewLengthとoriginalである.lengthの小さな値.要素はoriginal配列の要素です(newLengthとoriginal.lengthの小さな値に0を取ります).
はっきり言って、この方法は配列要素の向上のためで、また配列を遮断します
2. (Object)newType == (Object)Object[].class
newTypeがObject配列かどうかを判断する
3.なぜ(Object)をつけるのですか?
==を使用してメモリアドレスを比較し、同じタイプかどうかを判断するために==を使用するには、Objectに強く移行します.そうしないと、エディタは通過させず、比較できません.
public class SystemArrayCopy {

    public static void main(String[] args) {
        System.out.println(Object.class == Integer.class);
    }
}
/*
 :
Error:(37, 41) java:  : java.lang.Class java.lang.Class
*/

(Object)を付けると
public class SystemArrayCopy {

    public static void main(String[] args) {
        System.out.println(Object.class == (Object)Integer.class);
    }
}
/*
false
*/

4. newType.getComponentType()
public native Class<?> getComponentType();

ローカルメソッド、配列内の要素タイプを返し、配列でない場合nullを返します.
public class SystemArrayCopy {

    public static void main(String[] args) {
        String[] o = {"aa", "bb", "cc"};
        System.out.println(o.getClass().getComponentType());
        System.out.println(Object.class.getComponentType());
    }
}
/*
class java.lang.String
null
*/

5. Array.newInstance(newType.getComponentType(), newLength)
新しいタイプと同じ長さのnewLengthの配列を作成します.
public static Object newInstance(Class<?> componentType, int length)
    throws NegativeArraySizeException {
    return newArray(componentType, length);
}
private static native Object newArray(Class<?> componentType, int length)
        throws NegativeArraySizeException;

Array.NewInstance内部直接Arrayを呼び出す.newArray,newArrayはローカルメソッドであり,仮想マシンによって実現される.
新InstanceはObjectとして返され、実質的に配列となる
public class SystemArrayCopy {

    public static void main(String[] args) {
        Object o = Array.newInstance(String.class, 10);
        System.out.println(o.getClass());
        System.out.println(String.class); //  
    }
}
/*
class [Ljava.lang.String;
class java.lang.String
*/

見えるよNewInstanceの戻りはObjectタイプですが、実質的にString配列であり、String[]に強制的に変換できます.たとえば、String[]arr=(String[])Array.newInstance(String.class, 10);
4.(T[])new Object[newLength]ですが、なぜObject[]が強制的にT[]に変換できるのでしょうか.
  • 判断(Object)newType=(Object)Object[].class
  • がtrueの場合、(T[])new Object[newLength]が実行する、TはObject、newTypeもObject[]である.classなので、T[]
  • に強く変えることができます
  • がfalseの場合、(T[])Arrayが実行する.newInstance(newType.getComponentType(), newLength),Array.新Instanceが返す本質はT[]であるため,T[]
  • に強く転換できる.
    6.なぜObject[]ではなくT[]に強く転換したのか.
    私のこの方法はT[]に戻るので、これは方法の編纂の本意です.
    7.作用
  • ソース配列中の要素のタイプを上へ転換
  • は配列を切断する、所与の長さが所与の配列より小さい場合、切断の効果
  • を実現することができる.
    例えば、ArrayList下位配列のタイプ変換に使用するこの方法(ArrayListパラメータが集合のコンストラクタである)