[Java]配列の一括初期化にはArrays.fill()[メモ]

 配列の初期化をするとき、今まではいちいちfor文ループで代入を行っていたのですが、あんまりにもだるいので検索したら、手ごろな関数が転がっていたのでメモ。

広告

何故初期化がいるか

 プログラムにおける、宣言した時点での初期値が環境によって違ってくるから。

Arrays.fill()で一括で同じ値を設定

int[] i_array = new int[20];
Arrays.fill(i_array, first_value);

 このようにしてArrays.fillでは初期値を設定できる。(ただしfirst_valueは初期値を入れた変数とする)
 なお、
int[] i_array = new int[20];
Arrays.fill(i_array, int fromIndex, int toIndex, first_value);

とした場合、fromIndexとtoIndexを使って、同じ値にする範囲を指定することができる。

オブジェクト配列でArrays.fill()を使う場合の注意

 オブジェクト配列でも初期化は可能だが、コピーは参照渡しであることに留意。基本的に配列全ての要素が指すオブジェクトが同一のものになる。これは

Example[] ex_array = new Example[20];
Arrays.fill(ex_array, new Example());

とした場合でも同じで、この場合は一つのnew Example()を配列の全要素に代入することになる。つまり、配列の全ての要素が同じオブジェクトを指す。結局、関数に渡されたオブジェクトを関数内でfor文ループしているだけなので、いちいちnew Example();がなされない。

 故に、配列の要素それぞれを新しいインスタンスで初期化したい場合は、for文ループで相当する処理をすることとなる。
 プリミティブ型配列の場合は普通にコピーされるので、このあたりは気にしなくて良い模様。Stringも基本的には同じアドレスのstrを指すが、たとえばstr_array[i]などに値を指定しなおすのは、そのi番目の要素が指すポインタがかわるだけなので、そこまで気にしなくてもいいかもしれません。

広告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA