9-1. 演習問題
問題1:選択問題
Section titled “問題1:選択問題”1-1. 次のJavaコードはどうなるか。
String s1 = "hello";String s2 = new String("hello");System.out.println(s1 == s2);System.out.println(s1.equals(s2));- A.
trueとtrue - B.
falseとtrue - C.
trueとfalse - D.
falseとfalse
解答と解説
正解:B
== はオブジェクトの参照(アドレス)を比較する。s1 は文字列リテラルのキャッシュ(文字列プール)にある参照、s2 は new で別のオブジェクトを作った参照のため、アドレスが異なり false になる。
equals() は文字列の内容を比較するため、同じ内容なら true になる。
Javaの文字列比較は 必ず equals() を使う。== を使うとバグの原因になる。
1-2. 次のコードの出力はどれか。
int x = 10;double y = x;System.out.println(y);- A.
10 - B.
10.0 - C. コンパイルエラー
- D.
10L
解答と解説
正解:B
int から double への代入は暗黙の型拡大変換が行われる(int の範囲は double の範囲に収まるため)。double 型の値を出力すると小数点以下も表示されるため 10.0 になる。
逆に double から int への代入は精度が落ちるため、明示的なキャストが必要:
double d = 10.9;int n = (int) d; // 10(小数点以下は切り捨て)1-3. 次のコードで NullPointerException が発生するのはどの行か。
String s = null; // (A)int len = s.length(); // (B)boolean b = s == null; // (C)String t = s + "suffix"; // (D)- A. (A)
- B. (B)
- C. (C)
- D. (D)
解答と解説
正解:B
- (A):
nullを代入するだけなのでエラーなし - (B):
nullの参照に対して.length()を呼ぶとNullPointerException - (C):
== nullでの比較はnullに対して使えるためエラーなし(false/trueを返す) - (D):Javaでは
null + "suffix"は"null" + "suffix" = "nullsuffix"になる(エラーにならない)
NPEを防ぐには使う前に if (s != null) でチェックするか Optional を使う。
1-4. int 型の変数に格納できる最大値の範囲として正しいものはどれか。
- A. -128 〜 127
- B. -32768 〜 32767
- C. 約 -21億 〜 約 21億
- D. 約 -92京 〜 約 92京
解答と解説
正解:C
int は 32ビット符号付き整数で、-2^31 (-2,147,483,648) 〜 2^31 - 1 (2,147,483,647)。
- A は
byte(8bit) - B は
short(16bit) - C は
int(32bit)← これ - D は
long(64bit)
Integer.MAX_VALUE や Integer.MIN_VALUE で最大値・最小値を確認できる。業務でID管理をする際、数十億を超える可能性があれば long を選ぶ。
問題2:穴埋め問題
Section titled “問題2:穴埋め問題”2. 次のコードの( )に入る正しいコードを答えよ。
// (1) 浮動小数点型の変数宣言(64bit精度)(1) price = 1980.5;
// (2) 文字列の内容を比較する(== は使わない)String a = "hello";String b = "hello";boolean same = a.(2)(b);
// (3) String.format で "Alice (30歳)" という文字列を作るString name = "Alice";int age = 30;String msg = String.(3)("%s (%d歳)", name, age);
// (4) null 安全に文字列の長さを取得する(null なら 0 を返す)String s = null;int len = (4)(s != null ? s.length() : 0);解答と解説
doubleequalsformatint len =((int)は不要。三項演算子の型はintなのでそのまま代入できる)
解説
(1) double は64bitの倍精度浮動小数点型。float(32bit)との違いは精度。業務では特別な理由がなければ double を使う。
(2) 文字列の内容比較は必ず equals() メソッドを使う。== はオブジェクトの参照を比較するため期待通りに動かないことがある。
(3) String.format(書式, 引数...) でフォーマット文字列を作る。%s は文字列、%d は整数に対応する。
(4) 三項演算子 条件 ? 真の値 : 偽の値 で null チェックしながら値を返す。
問題3:記述問題
Section titled “問題3:記述問題”3-1. JavaとJavaScriptの「型システム」の違いを、静的型付けと動的型付けの観点から説明せよ。
解答と解説
Javaは静的型付け言語
変数宣言時に型を明示し、型チェックはコンパイル時に行われる。
int count = 0;count = "hello"; // コンパイルエラー:型が合わない- メリット:型の不一致によるバグをコンパイル時に検出できる。IDEによる補完・リファクタリングが強力。
- デメリット:型宣言の記述量が増える。
JavaScriptは動的型付け言語
変数に型はなく、値に型がある。型チェックは実行時に行われる。
let count = 0;count = "hello"; // エラーなし(実行時に型が変わる)- メリット:記述が短く、柔軟な書き方ができる。
- デメリット:実行するまで型エラーが分からない。大規模開発では TypeScript(型注釈付きのJavaScript)が使われる理由の一つ。
実務的な違い:Javaでは「コンパイルが通れば型に関するバグはない」という安心感がある。JavaScriptはTypeScriptを使うことで静的型付けに近い安全性を得られる。
3-2. 次のコードをコンパイルエラーや実行時エラーが発生しないように修正し、修正の理由を説明せよ。
public class Sample { public static void main(String[] args) { double d = 9.99; int i = d; System.out.println(i); }}解答と解説
修正後のコード:
public class Sample { public static void main(String[] args) { double d = 9.99; int i = (int) d; // 明示的キャスト System.out.println(i); // 9 }}修正の理由:
double から int への代入は縮小変換(情報が失われる可能性がある変換)のため、Javaコンパイラは暗黙の変換を許可しない。
(int) d と明示的にキャストすることで「精度が落ちることを承知の上で変換する」という意図を示す。小数点以下は切り捨てられ、9.99 → 9 になる。
丸め処理が必要な場合は (int) Math.round(d) で四捨五入してからキャストする。
問題4:ハンズオン
Section titled “問題4:ハンズオン”下の Java WASM プレイグラウンドでコードを実行し、型・キャスト・文字列比較・null の振る舞いを確認せよ。
取り組む内容
Section titled “取り組む内容”- まずそのまま実行し、各型の最大値・最小値と比較結果を確認する
double→intのキャスト結果がどうなるか確認する==とequals()の違いを出力で確認するnullStr.length()のコメントを外したときに何が起きるか観察する
確認したいポイント
Section titled “確認したいポイント”Integer.MAX_VALUEのような定数が「型の境界」を調べるのに便利な理由- キャストで小数点以下が切り捨てられること
- NPE は「コンパイル時」ではなく「実行時」に見つかること