あなたは生の配列で動作していないArrayList
しなければならない場合は、Arrays
はあなたが必要なものを持っています。ソースコードを見ると、配列のコピーを得るための最良の方法です。 System.arraycopy()
メソッドは、非論理的なパラメータを入力すると、チェックされていない例外を多くスローするため、防衛プログラミングの優れた点があります。
Arrays.copyOf()
のいずれかを使用して、最初の部分からNth
要素を新しい短い配列にコピーできます。
public static <T> T[] copyOf(T[] original, int newLength)
コピー指定された配列、ヌル( 必要であれば)と切り捨てまたはパディングので、コピーは、指定された長さを有します。 が元の配列とコピーの両方で有効なすべてのインデックスに対して、2つの配列は同じ値を含む になります。 のコピーで有効なインデックスの場合、コピーはnullを含みます。指定された長さが元の配列 の長さより大きい場合にのみ、そのようなインデックスは になります。結果の配列は元の配列 とまったく同じクラスです。
public static <T> T[] copyOfRange(T[] original, int from, int to)
新しい配列にコピー指定された配列の指定された範囲:
2770
2771 public static <T,U> T[] More ...copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2772 T[] copy = ((Object)newType == (Object)Object[].class)
2773 ? (T[]) new Object[newLength]
2774 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2775 System.arraycopy(original, 0, copy, 0,
2776 Math.min(original.length, newLength));
2777 return copy;
2778 }
またはArrays.copyOfRange()
もトリックを行います。 範囲の最初のインデックス(from)は、ゼロと original.length(両端を含む)の間にある必要があります。元の[from]の値は、コピーの最初の要素である に配置されます(ただし、== original.lengthまたは ==から)。元の配列の後続の要素の値は、コピー内の次の要素に配置された です。 の範囲の最終インデックス(to)は、 (original.length)より大きい場合があります。この場合、インデックスが大きいか等しいインデックスのすべての 要素にnullが格納されます〜 original.length - from。返される配列の長さは〜 からです。結果の配列は元の 配列とまったく同じクラスです。あなたが見ることができるように
3035 public static <T,U> T[] More ...copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
3036 int newLength = to - from;
3037 if (newLength < 0)
3038 throw new IllegalArgumentException(from + " > " + to);
3039 T[] copy = ((Object)newType == (Object)Object[].class)
3040 ? (T[]) new Object[newLength]
3041 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
3042 System.arraycopy(original, from, copy, 0,
3043 Math.min(original.length - from, newLength));
3044 return copy;
3045 }
、これらの両方が何をやろうとしていることは有効であると守備のロジックとSystem.arraycopy
以上の単なるラッパーの機能があります。
System.arraycopy
は、配列をコピーする最も速い方法です。
O(1)の時間にこれを行うことはできません。 Javaの配列の長さは変更できないため、新しい配列を作成する必要があります。 Jarrodの答えはこれを正しく行う方法の詳細を提供します。 –
@マスおかげさまで、それがもっと速くできるかどうか疑問に思っていました。 –