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[]に変換できるのでしょうか.
6.なぜObject[]ではなくT[]に強く転換したのか.
私のこの方法はT[]に戻るので、これは方法の編纂の本意です.
7.作用
例えば、ArrayList下位配列のタイプ変換に使用するこの方法(ArrayListパラメータが集合のコンストラクタである)