java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

配列の末尾に追加する

投稿日:

最終更新日:2016年07月07日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。今回はSystem#arraycopyを使って、配列を扱う独自のクラスを作ってみようと思います。元々はString#concatを見てまして、末尾に文字列を追加するメソッドなのですが、内部の方ではSystem#arraycopyを使っていることが分かりました。なのでSystem#arraycopyをちょっと実験的に使ってみます。

クラスを作成

独自クラスを作って、System#arraycopyを使います。以下のような構成にします。

クラス名 MyChars
フィールド
private char[] chars
文字を保持する変数。
コンストラクタ
public MyChars(String s)
引数sをchar型配列に変換し、フィールドcharsに格納する。
メソッド
public char[] getChars()
フィールドcharsを返却する。
public MyChars append(String str)
引数strをフィールドcharsの末尾に追加する。

このクラスを使って、プログラミングしてみました。

プログラム

以下は試しにMyCharsクラスを使った実験ソースと実行結果です。

ソース

package systemTest;

import java.util.Arrays;

public class HelloArrayCopy {

    public static void main(String[] args) {

        MyChars myChars = new MyChars("Hello");
        System.out.println(myChars.getChars());

        myChars.append(" Wo");
        System.out.println(myChars.getChars());

        myChars.append("rld").append(".");
        System.out.println(myChars.getChars());

    }

}

class MyChars {

    private char[] chars;

    public MyChars(String s) {
        this.chars = s.toCharArray();
    }

    public char[] getChars() {
        return chars;
    }

    public MyChars append(String str) {

        if (str == null || str.length() == 0) {
            return this;
        }

        char buf[] = Arrays.copyOf(this.chars, this.chars.length + str.length());

        char[] source = str.toCharArray();
        System.arraycopy(
                source, //  転送元配列
                0, // ソース配列の開始位置。
                buf, // 転送先配列
                this.chars.length, // 転送先データ内の開始位置。
                source.length // コピーされる配列要素の数。
                );

        this.chars = buf;

        return this;

    }


}

結果

Hello
Hello Wo
Hello World.

解説

mainメソッドを持つHelloArrayCopyのjavaファイルにMyCharsを定義しましたが、あまりこのような書き方はしません。通常は一つのjavaファイルに一つのクラスを定義します。(内部クラスは別として。)

appendメソッドで使っているArrays.copyOfは指定した第二引数が第一引数の配列の長さより大きい場合、nullで埋めてくれるようです。append(” wo”)と書いた箇所ではArrays.copyOfにより、bufが次のように作られます。

要素番号 0 1 2 3 4 5 6 7
内容 H e l l o null null null

このnullで埋められた要素に第一引数sの内容をSystem.arraycopyメソッドでコピーしています。今回の引数の場合だと、以下の図のようになります。

arrayCopy

引数が多くて難しそうなメソッドですが、基本的には今回のようにnullで埋めた箇所にコピー元の内容を詰めていく使い方をする場面が多いメソッドだと思います。上書きするような使い方もあるのかもしれませんが。