AI作成・独立検証済(有資格者監修なし)1Z0-815 対応
ラッパークラス(Integer キャッシュと == の参照比較)難易度 高無料

次のコードの出力として正しいものを選べ。

1  public class Q18 {
2      public static void main(String[] args) {
3          Integer a = 100, b = 100;
4          Integer c = 200, d = 200;
5          System.out.println((a == b) + " " + (c == d));
6      }
7  }
  1. Atrue false
  2. Btrue trueInteger== は常に値を比較する)
  3. Cfalse false(オートボクシングされた Integer は常に新しいオブジェクトになる)
  4. Dコンパイルエラー(Integer 型どうしを == で比較することはできない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Integer a = 100; のような記述はオートボクシングにより内部的に Integer.valueOf(100) が呼ばれる。 Integer.valueOf(int)-128 〜 127 の範囲の値については、あらかじめ用意されたキャッシュ済みインスタンスを使い回す(同じ値なら同一オブジェクトを返す)。

ab100(キャッシュ範囲内)なので、同一のキャッシュ済みオブジェクトを参照する。参照を比較する ==true

cd200(キャッシュ範囲)なので、valueOf は都度新しい Integer オブジェクトを生成する。 値は等しくても参照が異なるため、c == dfalse

出力は "true false"

各誤答が違う理由
  • B== はラッパー型では参照比較。200 はキャッシュ範囲外のため cd は別オブジェクトになり false
  • C-128〜127の範囲は Integer のキャッシュが効き、同じ値なら同一オブジェクトが再利用される。a == b(値100)はキャッシュ範囲内なので true
  • DInteger は参照型であり == による比較自体は文法上合法(意味的には参照比較になるというだけ)。コンパイルエラーにはならない。
ひっかけ:Integer 同士を == で比較すれば値が等しい限り常に true」という思い込みが典型的な罠。==参照比較であり、たまたま-128〜127というキャッシュ範囲内だから true に見えるだけ。値そのものを安全に比較するには常に equals() を使うべき。
コマンド例と想定される挙動(未実行)
出力:
true false
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
この分野をもっと解いて、得点源に
データ型 を含む問題を分野別に演習できます。
演習する →