デフォルト値と初期化
デフォルト値と初期化
このレッスンでできるようになることは、new で作った配列の要素に何が入っているかを型ごとに答えられることです。
予測してください
int[] nums = new int[3];
boolean[] flags = new boolean[2];
String[] names = new String[2];
double[] rates = new double[2];Arrays.toString で出すと、順に [0, 0, 0]、[false, false]、[null, null]、[0.0, 0.0] になります。ローカル変数は初期化しないと使えませんが、配列の要素は new した時点で型ごとの既定値で埋まります。ここが混同されやすいところです。
既定値は次のとおりです。整数系の byte、short、int、long は 0、long は正確には 0L です。浮動小数点の float と double は 0.0、char は文字コード 0 の文字、boolean は false、参照型はすべて null です。char の既定値は空白文字ではなく文字コード 0 なので、そのまま出力しても何も見えません。空白と答えさせる選択肢が定番です。
長さ 0 の配列は null ではない
int[] empty = new int[0];
System.out.println(empty.length); // 0
int[] nothing = null;
System.out.println(nothing.length); // NullPointerExceptionnew int[0] は「要素が 0 個の配列」で、実体はあります。length は 0 で、例外にはなりません。一方 null を入れた配列変数に length を使うと実行時に NullPointerException になります。コンパイルは通るので、コンパイルエラーだと答えさせる選択肢が混ざります。
length と length()
配列の長さは arr.length で、フィールドなので丸括弧を付けません。String の長さは str.length() で、メソッドなので丸括弧が要ります。arr.length() も str.length も、どちらもコンパイルエラーです。この 1 文字の差が出題の定番なので、配列はフィールド、String はメソッド、と覚えてください。
なお List の要素数は size() です。3 つの言い方が混在するので、選択肢に arr.size() が並んでいたら誤りだと即答できます。
要件
- 4 つの配列は new だけで作り、値を代入しない
- which が 1 なら nums、2 なら flags、3 なら names、4 なら rates を返す
- それ以外のときは 配列の長さと文字列の長さを カンマでつないで返す
- 配列は
Arrays.toStringを通してから返す
入出力例
probe(1) → "[0, 0, 0]"
probe(2) → "[false, false]"
probe(3) → "[null, null]"
probe(4) → "[0.0, 0.0]"
probe(5) → "3,3"