配列の長さを延長する

1. 概要

このチュートリアルでは、Java link:/java-arrays-guide[array]を拡張するさまざまな方法を見ていきます。
配列は連続したメモリブロックであるため、答えはすぐには分からないかもしれませんが、今すぐアンパックしましょう。

*2. Arrays.copyOf *の使用

まず、_Arrays.copyOf_を見てみましょう。 配列をコピーし、コピーに新しい要素を追加します。
public Integer[] addElementUsingArraysCopyOf(Integer[] srcArray, int elementToAdd) {
    Integer[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);
    destArray[destArray.length - 1] = elementToAdd;
    return destArray;
}
_Arrays.copyOf_の動作方法は、_srcArray_を受け取り、length引数で指定された要素の数を、内部で作成する新しい配列に*コピーすることです。 新しい配列のサイズは、提供する引数です。
注目すべきことの1つは、長さの引数がソース配列のサイズよりも大きい場合、_Arrays.copyOf_は宛先配列の余分な要素を_null_で埋めることです。
*データ型に応じて、塗りつぶしの動作が異なります。たとえば、_Integer_の代わりにプリミティブデータ型を使用すると、余分な要素はゼロで埋められます。 _char_の場合、_Arrays.copyOf_は_null_で余分な要素を埋め、_boolean、_の場合は_false_で埋めます。

*3. ArrayList *の使用

次に説明する方法は、_ArrayList._を使用することです
まず、配列を* _ * ArrayList * _に*変換してから、要素を追加します。 次に、_ArrayList_を配列に変換します*:
public Integer[] addElementUsingArrayList(Integer[] srcArray, int elementToAdd) {
    Integer[] destArray = new Integer[srcArray.length + 1];
    ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(srcArray));
    arrayList.add(elementToAdd);
    return arrayList.toArray(destArray);
}
__srcArray ___を__Collectionに変換して渡したことに注意してください。 ___srcArray_は、* _ * ArrayList * ._内の基礎となる配列に値を設定します。
また、注意すべきもう1つの点は、_toArray_への引数として宛先配列を渡したことです。 このメソッドは、基になる配列を_destArray_ *に*コピーします。

*4. System.arraycopy *の使用

最後に、_System.arraycopy_を見てみましょう。これは、_Arrays.copyOf_と非常によく似ています。
public Integer[] addElementUsingSystemArrayCopy(Integer[] srcArray, int elementToAdd) {
    Integer[] destArray = new Integer[srcArray.length + 1];
    System.arraycopy(srcArray, 0, destArray, 0, srcArray.length);
    destArray[destArray.length - 1] = elementToAdd;
    return destArray;
}
興味深い事実の1つは、* __ Arrays.copyOf ___internallyがこのメソッドを使用していることです。*
ここで、_srcArray_から_destArray_ *に要素をコピーしてから、_destArray_に*新しい要素を追加*することがわかります。

5. パフォーマンス

すべてのソリューションに共通することの1つは、何らかの方法で新しいアレイを作成する必要があることです。 その理由は、メモリ内での配列の割り当て方法にあります。 配列は、超高速ルックアップのために*連続したメモリブロック*を保持しているため、単純にサイズを変更することはできません。
もちろん、これは、特に大きなアレイの場合、パフォーマンスに影響を与えます。 これがlink:/java-arraylist[_ArrayList_]が過剰に割り当てられ、JVMがメモリを再割り当てする必要がある回数を効果的に削減する理由です。
ただし、多くの挿入を行う場合、配列は正しいデータ構造ではない可能性があるため、https://www.baeldung.com/java-linkedlist [_LinkedList_]を検討する必要があります。

6. 結論

この記事では、配列の最後に要素を追加するさまざまな方法を検討しました。
そして、いつものように、コード全体はhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-arrays-2[GitHubで]から入手できます。