1. 概要

このチュートリアルでは、Java 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引数で指定された要素の数をコピーすることです。 新しい配列のサイズは、私たちが提供する引数です。

長さの引数がソース配列のサイズよりも大きい場合、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 それをに変換することによってコレクション。  The srcArray 意思基になる配列にデータを入力します配列リスト。

また、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が内部的にこのメソッドを使用していることです。

ここで、要素をsrcArrayからdestArray コピーしてから、新しい要素destArrayに追加していることがわかります。

5. パフォーマンス

すべてのソリューションに共通することの1つは、何らかの方法で新しいアレイを作成する必要があることです。 その理由は、配列がメモリにどのように割り当てられるかにあります。 配列は、超高速ルックアップのために連続したメモリブロックを保持します。そのため、単純にサイズを変更することはできません。

もちろん、これは、特に大規模なアレイの場合、パフォーマンスに影響を与えます。 これが、 ArrayList が過剰に割り当てられ、JVMがメモリを再割り当てする必要がある回数を効果的に削減する理由です。

ただし、多くの挿入を行う場合は、配列が適切なデータ構造ではない可能性があるため、LinkedListを検討する必要があります。

6. 結論

この記事では、配列の最後に要素を追加するさまざまな方法について説明しました。

そして、いつものように、コード全体はGitHub利用できます。