Java silver se11の試験対策で黒本を解いていた際のlenthの動きをまとめました。
初心者向け
2次元配列 length
◼︎ 黒本 第12章 総仕上げ問題①
80.次のプログラムをコンパイル、実行したときの
結果として、正しいものを選びなさい。
(1つ選択)
public class Test {
public static void main(String[] args) {
String[][] arrays = new String[2][];
array[0] = new String[2];
array[1] = new String[5];
int i = 97;
for (int a = 0; a < array.length; a++) {
for(int b = 0; b < array.length; b++) {
array[a][b] = "" + i ;
i++;
}
}
for (String[] tmp : array) {
for(String s : tmp) {
System.out.print(s + "");
}
System.out.println();
}
}
}
A. 97 98
99 100 null null null
B. 97 98
99 100 101 102 103
C. コンパイルエラーが発生する
D. 実行時にNulIPointerExceptionがスローされる
E. 実行時にArrayindexOutofBoundsExceptionが
スローされる
答え: A
1行ずつ解説
public class Test {
//Testという名前のパブリッククラスを定義
public static void main(String[] args) {
/* プログラムのエントリポイントであるmainメソッドを定義
プログラムはここから開始 */
String[][] arrays = new String[2][];
/* arrayという名前の2次元配列を宣言
2列の配列を持つが、まだ各行の配列は
決まっていない
*/
array[0] = new String[2];
//arrayの0行目に2列の配列を割り当て
array[1] = new String[5];
//arrayの1行目に5列の配列を割り当て
int i = 97; //整数変数iを97(文字コードa)で初期化
for (int a = 0; a < array.length; a++) {
//外側のforループ 各行の列数だけ繰り返す
for(int b = 0; b < array.length; b++) {
//内側のforループ 条件がarray.lengthになっている
/* 各行の配列array[a].lengthを使う必要がある
2列名以降が初期化されずnullのままになる */
array[a][b] = "" + i ;
//array[a][b]に文字列としてiの値を代入
i++;
//iをインクリメントして次の文字コードにする
}
}
for (String[] tmp : array) {
//拡張forループを使ってarrayの各行をtmpに取り出す
for(String s : tmp) {
//拡張forループを使って各行の各要素をsに取り出す
System.out.print(s + "");
//各要素String sを出力
}
System.out.println();
//各行を出力した後に改行する
}
}
}
nullが出力される理由
arrayの0行目は2列、1行目は5列だが、内側のforループがarray.lengthを条件にしているため、各行の列数を正しく処理出来ていない
そのため以下のように配列の一部のみが初期化され、他はnullのままとなる
•array[0][0]とarray[0][1]には値が入るが、それ以外の列は初期化されない
•array[1][0]とarray[1][1]にも値が入るが、それ以外の列array[1][2]、array[1][3]、array[1][4]は初期化されずnullのまま
そのため出力結果は以下のようになる
97 98
99 100 null null null
拡張for文と通常のfor文の違い
通常のfor文
ループの初期化・条件・更新部分を自分で指定する
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
・int i = 0;で初期化
・i < array.length;が条件
・i++で更新
拡張for文
コレクションや配列の全ての要素に対して
繰り返し処理を行うために使う
for (String element : array) {
System.out.println(element);
}
arrayの各要素をelementとして順に取り出す
それぞれの違い
•拡張for文はシンプルで読みやすいが、インデックス(位置)にアクセス出来ない
•通常のfor文は柔軟でインデックスの操作が可能
文字コードと文字
コンピュータでは、文字を数値(文字コード)で表す。たとえば、‘A’の文字コードは65
char ch = 65; // 文字コード65に対応する文字 'A'
System.out.println(ch); // 'A'が出力される
文字から文字コードへの変換
文字を数値に変換する場合、キャスト(型変換)を使う
char ch = 'A';
int code = (int) ch; // 'A'を整数に変換
System.out.println(code); // 65が出力される
配列の読み方
1次元配列
1次元配列は単純なリストのイメージ
int[] array = {1, 2, 3, 4};
System.out.println(array[0]); // 1
System.out.println(array[1]); // 2
•array[0]は最初の要素。
•array[1]は2番目の要素。
2次元配列
2次元配列は行と列を持つ表のようなイメージ
int[][] array = {
{1, 2, 3},
{4, 5, 6}
};
System.out.println(array[0][0]); // 1
System.out.println(array[1][2]); // 6
•array[0][0]は1行目の1列目の要素。
•array[1][2]は2行目の3列目の要素。