プリミティブ型とラッパークラスを理解する
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への変換にも同じ注意が必要です。
図解
重要ポイント
- intとIntegerは同じ型ではない。
- nullのラッパーをアンボクシングすると例外になる。
- Integer.equalsは相手の型とint値を比較する。
- ラッパーは不変で、++は共有オブジェクトの値を変更しない。
間違えやすい点
- Integer同士の==を一般的な数値比較として使わない。
- parseIntはint、valueOfはIntegerを返す。
- 大きい値のキャッシュ範囲を実装共通と決めつけない。
用語解説
- ボクシング
- int等の値を対応するInteger等の参照型へ変換すること。
- アンボクシング
- ラッパーから対応するプリミティブ値を取り出す変換。
- 値の比較
- 同一参照かどうかとは別に、保持する値を比較すること。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
- https://www.oracle.com/jp/education/certification/javase-17-programmer-1/
- https://docs.oracle.com/javase/specs/jls/se17/html/jls-14.html#jls-14.4
- https://docs.oracle.com/javase/specs/jls/se17/html/jls-5.html#jls-5.1.8
- https://docs.oracle.com/javase/specs/jls/se17/html/jls-15.html#jls-15.23
- https://docs.oracle.com/javase/specs/jls/se17/html/jls-15.html#jls-15.25
- https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Integer.html
- https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Objects.html
- https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ArrayList.html
確認問題の出題・採点や学習履歴の保存にはログインが必要です。