最初に
この記事は、以下の書籍を通じてJava silverの合格に向けて自分が学んだ内容を体系的にアウトプットする記事である。(目指せ年内合格!)
徹底攻略Java SE 11 Silver問題集[1Z0-815]対応
勉強記録
配列の操作
要素を一つも扱わない配列インスタンスの挙動
- 以下のコードを実行した場合の結果はどうなるだろうか?
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
int [] a = new int[0];
System.out.println(a);
System.out.println(a[0]);
String [] b = new String[0];
System.out.println(b);
}
}
- 結果は以下である。
[I@2626b418
[Ljava.lang.String;@5a07e868
-
なぜこうなるか?
-
配列は、そもそも参照型でObjectクラスを継承
-
printlnメソッドにより、参照先のtoStringメソッドが呼ばれる
-
ObjectクラスのtoStringメソッドは、以下の定義となっているため
public String toString(){ return getClass().getName() + "@" + Integer.toHexString(hashCode()); // クラス名とインスタンスを一意に分けるためのハッシュコード }
-
配列の宣言
- 配列の[]は、変数の後につけても、型の後につけても良い。
- 他言語との互換性のため。
// 以下すべてコンパイルエラーとならない。
int[]a;
int b[];
int [][]c;
int c[][];
int []c[];
int [][]d[];
配列のデフォルト値
- 配列インスタンスを生成しただけでは、要素の中身は作られることはない
- なので、生成後に要素の値を代入する必要がある
- ただし、生成直後は以下のデフォルトの値が格納されている
型 | デフォルト値 |
---|---|
整数型 | 0 |
浮動小数点数型 | 0.0 |
真偽型 | false |
文字型 | ¥u0000 |
オブジェクト型 | null |
配列の初期化子「{}」
- 配列インスタンスの生成と同時に要素の値を初期化したい場合に使用
- 変数宣言と同時にしか使用できない
//以下はOK
int [] a = {};
int [] b = {1,2};
//以下はNG
int [] c;
c = {2,3};
- newと初期化子の両方を使って配列のインスタンス生成と初期化を同時に行う場合、要素数は自動で算出されるので、大括弧の中に要素数は指定できない。
//以下はOK
int [] a = new int[]{1,2};
//以下はNG
int [] b = new int[2]{1,2};
感想
- 配列の初期値などを意識して使ったことがなかったが、初期値を代入し忘れていてバグ発生するとかありそうだなと感じた。(要素を一つも扱わない配列インスタンスも同様にありそう。)