Programmingバックエンド開発者

Javaにおけるautoboxingとunboxingのメカニズムがどのように機能するか、それに伴うリスク、およびパフォーマンスやロジックエラーを引き起こす可能性がある場所について説明してください。

Hintsage AIアシスタントで面接を突破

回答。

Autoboxingは、プリミティブ型(intdoubleなど)を対応するラッパークラスのオブジェクト(IntegerDoubleなど)に自動的に変換することです。Unboxingは、ラッパークラスのオブジェクトを再びプリミティブ型に変換する逆のプロセスです。

これは、代入時、メソッドの引数、コレクションで自動的に機能します:

List<Integer> numbers = new ArrayList<>(); numbers.add(5); // Autoboxingの例:5 (int) -> Integer(5) int value = numbers.get(0); // Unboxing:Integer(5) -> 5

リスク:

  • nullのunboxing時にNullPointerExceptionが発生する可能性があります。
  • オブジェクトのラッパーを常に作成することによるメモリと時間の非効率な使用。
  • ==(参照による比較)とequalsでの複雑さ。

トリッククエスチョン。

次のコードは例外をスローする可能性がありますか?なぜですか?

Integer x = null; int y = x;

回答: コードはNullPointerExceptionをスローします。なぜなら、int y = x;を実行しようとすると、nullからプリミティブへのunboxingが発生し、nullintに変換することはできないからです。

このテーマの微妙な点を無知による実際のエラーメーカーの例。


物語

Integerラッパーのコレクション内の合計を計算すること。合計が増加するたびに新しいIntegerオブジェクトが作成され、intの使用を防ぎ、実サーバー上での重要な遅延を引き起こしました。

物語

プログラマーはキャッシュのキーとしてIntegerを使用しましたが、-128から127までの値はキャッシュされることを考慮せず、その他の値はキャッシュされませんでした。そのため、==が突然誤った結果を返し、キャッシュからデータが不正に削除される原因となりました。

物語

REST APIにnullableな値が届きました。受信したIntegerの単純なunboxingは、クライアントからの数値の代わりに予期しないnullが来たため、クラッシュを引き起こすことがありました。