プリミティブ型とラッパークラスを理解する

intなどは値そのものを扱うプリミティブ型、Integerなどは値を包む参照型です。自動変換、数値解析、等値比較、nullの危険を順に学びます。Java 17の結果として、値が等しいことと同じオブジェクトであることを区別します。

この単元で学ぶこと

  • ボクシングとアンボクシングを説明する
  • ==とequalsの条件に応じた結果を求める
  • 数値変換とnullによる例外を判定する

本文解説

値と参照型を分ける int n=3;は整数値を扱い、Integer x=3;はその値に対応するラッパーへの参照を持ちます。intにはnullを代入できませんがIntegerにはできます。参照型を要素として扱うArrayList<Integer>にはIntegerを使い、ArrayList<int>とは書けません。

ボクシングと取り出し Integer x=4;はintからIntegerへの自動ボクシングです。int n=x;はアンボクシングです。System.out.print(x+2);も算術演算のために値を取り出すので6になります。変数宣言だけでなく演算式の途中にも変換が入ります。

nullを数値にできない Integer x=null;は有効ですが、int n=x;やx+1を評価するとNullPointerExceptionになります。nullは0という数値ではありません。x==nullの比較は参照としての検査なので安全です。欠損値を0として扱うかエラーとするかは、計算する前に決めます。

文字列を整数へ変換 Integer.parseInt("12")はintの12を返し、Integer.valueOf("12")はIntegerを返します。"12"+1は文字列連結で121、Integer.parseInt("12")+1は13です。数字として不正な"12x"やintの範囲外の文字列はNumberFormatExceptionになります。

ラッパー同士の等値 Integer a=100,b=100;のa==bは参照比較です。この定数範囲ではボクシングの同一性が保証されtrueになりますが、それをすべての整数へ一般化してはいけません。値比較にはa.equals(b)などを使います。nullかもしれないaのequalsを直接呼ぶ場合は別途対策が必要です。

片方がプリミティブの比較 Integer a=1000;int b=1000;ならa==bはアンボクシング後の数値比較でtrueです。Integer同士の参照比較とは違います。aがnullならこの数値比較でもNullPointerExceptionになります。演算子が同じでもオペランドの型によって規則が変わります。

equalsは数値なら何でも同じではない Integer.valueOf(3).equals(Long.valueOf(3))はfalseです。Integer.equalsは相手もIntegerで値が等しい場合にtrueになります。Integer.valueOf(3).equals(null)もfalseです。nullを引数に渡すことと、nullの変数を受け手にしてequalsを呼ぶことを区別します。

ラッパーの値は変更しない Integer a=5;Integer b=a;a++;ではaの値を取り出して加算し、新しい値をaへ代入します。bは元の5のままです。Booleanも参照型で、Boolean b=null;if(b)は取り出し時に例外になります。数値だけでなくbooleanへの変換にも同じ注意が必要です。

図解

プリミティブとラッパーの往復
参照型には値なしのnullがあり、数値に取り出す時点を追う。

重要ポイント

  • intとIntegerは同じ型ではない。
  • nullのラッパーをアンボクシングすると例外になる。
  • Integer.equalsは相手の型とint値を比較する。
  • ラッパーは不変で、++は共有オブジェクトの値を変更しない。

間違えやすい点

  • Integer同士の==を一般的な数値比較として使わない。
  • parseIntはint、valueOfはIntegerを返す。
  • 大きい値のキャッシュ範囲を実装共通と決めつけない。

用語解説

ボクシング
int等の値を対応するInteger等の参照型へ変換すること。
アンボクシング
ラッパーから対応するプリミティブ値を取り出す変換。
値の比較
同一参照かどうかとは別に、保持する値を比較すること。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。