こんにちは。「Javaを復習する初心者」です。今回はSystem#arraycopyを使って、配列を扱う独自のクラスを作ってみようと思います。元々はString#concatを見てまして、末尾に文字列を追加するメソッドなのですが、内部の方ではSystem#arraycopyを使っていることが分かりました。なのでSystem#arraycopyをちょっと実験的に使ってみます。
クラスを作成
独自クラスを作って、System#arraycopyを使います。以下のような構成にします。
クラス名 | MyChars |
フィールド |
|
コンストラクタ |
|
メソッド |
|
このクラスを使って、プログラミングしてみました。
プログラム
以下は試しに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メソッドでコピーしています。今回の引数の場合だと、以下の図のようになります。
引数が多くて難しそうなメソッドですが、基本的には今回のようにnullで埋めた箇所にコピー元の内容を詰めていく使い方をする場面が多いメソッドだと思います。上書きするような使い方もあるのかもしれませんが。