はじめに
Java Silver(SE 21対応)試験対策として、演算子と型変換に関する問題を10問まとめました。暗黙的型変換やキャスト、==とequals()の違いなど、試験頻出のトピックを網羅しています。
問1 ⭐ 整数の除算
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
int a = 7;
int b = 2;
double result = a / b;
System.out.println(result);
}
}
A. 3.5
B. 3.0
C. 3
D. コンパイルエラー
解答と解説
正解: B
a / bはint / intなので、整数除算が行われます。結果は3(int型)です。その後、double変数に代入される際にint→doubleの拡大変換が起こり、3.0になります。
3.5を得たい場合は、少なくとも一方をdoubleにする必要があります。
double result = (double) a / b; // 3.5
問2 ⭐ 後置・前置インクリメント
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
int x = 5;
int y = x++ + ++x;
System.out.println("x=" + x + ", y=" + y);
}
}
A. x=7, y=12
B. x=7, y=11
C. x=6, y=12
D. x=7, y=13
解答と解説
正解: A
処理を順に追います。
-
x++:式の評価値は5(後置なので現在の値を返す)。その後xは6になる -
++x:xを先にインクリメント。xは7になり、式の評価値は7(前置なので加算後の値を返す) y = 5 + 7 = 12
結果: x=7, y=12
問3 ⭐⭐ 論理演算子(短絡評価)
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
int x = 0;
boolean result = (x != 0) && (10 / x > 1);
System.out.println(result);
}
}
A. false
B. true
C. ArithmeticExceptionが発生
D. コンパイルエラー
解答と解説
正解: A
&&(論理AND)は短絡評価(short-circuit evaluation) を行います。左辺がfalseの場合、右辺は評価されません。
-
x != 0→0 != 0→false - 左辺が
falseなので、右辺10 / x > 1は評価されない(ゼロ除算は起こらない) - 結果は
false
もし&(ビットAND/非短絡AND)を使った場合は、右辺も評価されるためArithmeticExceptionが発生します。
boolean result = (x != 0) & (10 / x > 1); // ArithmeticException
問4 ⭐⭐ 暗黙的型変換
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
byte b = 10;
short s = 20;
var result = b + s;
System.out.println(((Object) result).getClass().getSimpleName());
}
}
A. Byte
B. Short
C. Integer
D. Long
解答と解説
正解: C
byteとshortの算術演算では、両方のオペランドがintに拡大変換(promotion) されてから演算が行われます。結果もint型です。
Javaの算術演算における型の昇格規則:
- いずれかのオペランドが
double→ 他方もdoubleに変換 - いずれかが
float→ 他方もfloatに変換 - いずれかが
long→ 他方もlongに変換 - それ以外 → 両方
intに変換
byte + shortは規則4に該当し、結果はint(ボクシングでInteger)になります。
問5 ⭐⭐ 明示的キャスト
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
int i = 300;
byte b = (byte) i;
System.out.println(b);
}
}
A. 300
B. 44
C. -128
D. 0
解答と解説
正解: B
intからbyteへのキャストは縮小変換(narrowing conversion) です。上位ビットが切り捨てられます。
300の2進数表現: 00000000 00000000 00000001 00101100
byteにキャストすると下位8ビット00101100だけが残り、10進数で44です。
縮小変換では、元の値がターゲット型の範囲を超える場合、情報が失われます。コンパイルエラーにはなりませんが、予期しない値になることがあります。
問6 ⭐ ==とequals()(プリミティブ)
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
int a = 10;
double b = 10.0;
System.out.println(a == b);
}
}
A. true
B. false
C. コンパイルエラー
D. 実行時エラー
解答と解説
正解: A
プリミティブ型同士の==比較では、型が異なる場合、小さい方の型が大きい方に拡大変換されてから比較されます。
int a = 10がdoubleに変換されて10.0になり、10.0 == 10.0はtrueです。
プリミティブ型の==は「値」の比較です。参照型の==は「参照(メモリアドレス)」の比較であることと区別してください。
問7 ⭐⭐ ==とequals()(参照型)
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
String s1 = new String("Hello");
String s2 = new String("Hello");
String s3 = "Hello";
String s4 = "Hello";
System.out.println(s1 == s2);
System.out.println(s3 == s4);
System.out.println(s1.equals(s2));
}
}
A. false, true, true
B. true, true, true
C. false, false, true
D. false, true, false
解答と解説
正解: A
-
s1 == s2→new String()で明示的に生成した別オブジェクトなのでfalse -
s3 == s4→ 文字列リテラルは文字列プールに格納され、同じ内容のリテラルは同じ参照を共有するためtrue -
s1.equals(s2)→equals()は内容(文字列の値)を比較するためtrue
試験では==とequals()の違い、文字列プールの仕組みがよく問われます。
問8 ⭐⭐⭐ 複合代入演算子とキャスト
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
byte b = 10;
b += 200;
System.out.println(b);
}
}
A. 210
B. -46
C. 0
D. コンパイルエラー
解答と解説
正解: B
複合代入演算子+=には暗黙的なキャストが含まれています。
b += 200;はb = (byte)(b + 200);と同等です。
b + 200 = 10 + 200 = 210(int型)
210の2進数: 00000000 00000000 00000000 11010010
byteにキャスト(下位8ビット): 11010010(符号付きで**-46**)
b = b + 200;と書いた場合はintをbyteに暗黙変換できないためコンパイルエラーになりますが、b += 200;は暗黙キャストが行われるためコンパイルが通ります。これは試験の頻出ポイントです。
問9 ⭐⭐⭐ Integerキャッシュ
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b);
System.out.println(c == d);
}
}
A. true, true
B. false, false
C. true, false
D. false, true
解答と解説
正解: C
Integerは-128〜127の範囲でキャッシュを使用します(JLS 5.1.7)。
-
aとbは値127(キャッシュ範囲内)→ 同じオブジェクトを参照 →a == bはtrue -
cとdは値128(キャッシュ範囲外)→ 別オブジェクトが生成される →c == dはfalse
ラッパー型の比較には必ずequals()を使うべきです。==はオブジェクト参照の比較であり、キャッシュの有無で結果が変わります。
問10 ⭐⭐ 演算子の優先順位
次のコードの出力は何ですか?
public class Main {
public static void main(String[] args) {
boolean result = true || false && false;
System.out.println(result);
}
}
A. true
B. false
C. コンパイルエラー
D. 実行時エラー
解答と解説
正解: A
演算子の優先順位は && > || です。
したがって、式は以下のように評価されます:
true || (false && false)
= true || false
= true
もし||が先に評価されると(true || false) && false = true && false = falseになりますが、&&の方が優先順位が高いため結果はtrueです。
さらに||は短絡評価を行うため、左辺がtrueの時点で右辺(false && false)は評価されません。
参考
- Oracle Java SE 21 Language Specification - Chapter 5. Conversions and Contexts
- Oracle Java SE 21 Language Specification - Chapter 15. Expressions
- Oracle Java Tutorials - Operators
@kotaro_ai_lab
AI活用や開発効率化について発信しています。フォローお気軽にどうぞ!