Java.下へcopyOfメソッドソースコードの詳細

16210 ワード

Java.下へcopyOfメソッドソースコードの詳細


1.最もよく使われる2つのパラメータをテストするcopeOf方法

    @Test
    public void TestArraysCopyOf(){
        String[] s1 = {"damon1","damon2","damon3"};
        String[] s2 = Arrays.copyOf(s1, 3);
        System.out.println(Arrays.toString(s2));
        String[] s3 = Arrays.copyOf(s1, 1);
        System.out.println(Arrays.toString(s3));
    }
/**
 *  
 * [damon1, damon2, damon3]
 * [damon1]
 */

2. Arrays.copyOf()ソース部分

  • 直接呼び出す方法
  • @SuppressWarnings("unchecked")
    public static <T> T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }
    

    この方法は、伝達配列のclassオブジェクトを第3のパラメータとして呼び出す適用性がより広い別の関数である.
  • 間接呼び出し方法
  • 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;
    }
    

    注意点:
  • まず、この方法には、T、U、Tは、入力された3番目のパラメータnewType(入力されたタイプのclassオブジェクト)を表し、Tは、入力された1番目のオブジェクトoriginal(すなわち、元の配列のデータ型)
  • を表す2つの汎用型がある.
  • 三元演算子の判断条件*((Object)newType==(Object)Object[].class)は、newTypeがObjectタイプであるか否かを判定するためのものであり、上記第1の手法の前提で元の配列がObjectタイプであるか否かを判定する配列を表す.(Object)newType**ここでなぜモデルチェンジするのかは、モデルチェンジしないとエラーが発生するからです.
    //System.out.println(ArrayList.class==Object[].class);
    //Operator '==' cannot be applied to 'java.lang.Class', 'java.lang.Class'
    System.out.println((Object)ArrayList.class==Object[].class);
    // ArrayList class , false,IDEA Condition '(Object)ArrayList.class==Object[].class' is always 'false' 
    
  • 真、すなわち元の配列がObjectタイプの配列であると判断すると、所与の長さnewLengthの新しいObject配列を直接作成すればよい.(なぜ新しい配列を作成するのですか?この関数の目的は、配列の指定部分を新しい配列にコピーすることです.)偽である、すなわち元の配列がObject型配列でないと判断した場合、**(T[])Arrayを呼び出す.newInstance(newType.getComponentType()、newLength)**この方法は、newTypeの要素のタイプ(デフォルトではObjectタイプを返し、強制的に正しいタイプに変換できます.詳細は、次のコード例を参照してください)の配列を新規作成し、長さは指定のnewLengthです.
    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
    */
    
    を返します.
     private static native Object newArray(Class<?> componentType, int length)
            throws NegativeArraySizeException;
    
    newTypeと同様に長さが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;
    
    newInstanceが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);
  • 返す配列の種類と長さを作成した後、**Systemを呼び出す.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));**ここではシステムを呼び出す方法で配列の内容をコピーし、パラメータはそれぞれ、元の配列、元の配列の開始インデックス、目標配列、目標配列の開始インデックス、コピーの長さを表す.コピーの長さoriginal.lengthとnewLengthの最小値は、ここで指定する新しい長さが元の配列の長さよりも小さく、存在する遮断の可能性がある.
    @param      src      the source array.
    @param      srcPos   starting position in the source array.
    @param      dest     the destination array.
    @param      destPos  starting position in the destination data.
    @param      length   the number of array elements to be copied.
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);
    
  • コピーが完了すると、対応するターゲット配列copyに戻る.

  • まとめ


    ArrayListのソースコードを分析したときに見たのですが、これまでいろいろなところで見ていたので、ずっと研究していませんでしたが、今回は他のいくつかの資料を借りて自分のまとめをしてみました.要するに、ソースを見れば見るほど透き通った感じがする.このcsdnをお勧めするのは、この大物の研究精神を受けて書いたものだ.
    Arrays.copyOf()メソッドの詳細-jdk 1.8