AI作成・AIで再検証済(有資格者監修なし)1Z0-815-JPN 対応
ラッパークラス(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 true(Integer の == は常に値を比較する)
  3. Cfalse false(オートボクシングされた Integer は常に新しいオブジェクトになる)
  4. Dコンパイルエラー(Integer 型どうしを == で比較することはできない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・AIで再検証済

解説

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

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

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

出力は "true false"。

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

この問題集の作り方

  1. 問題と解説はAIが作成しています。この資格の問題に、有資格者(著者)の監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  5. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
データ型 を含む問題を分野別に演習できます。
演習する →