Javaのラッパークラスとは?intとIntegerの違いと使い分け|確認問題の回答例
Javaのラッパークラスとは?intとIntegerの違いと使い分けの確認問題の回答例です。型、保存される値、変換のタイミングを分けて確認しましょう。
問題1:intは基本データ型、残りは参照型
int、Integer、String、int[]を基本データ型と参照型に分けてください。また、intとIntegerの変数がそれぞれ何を持つか説明してください。
| 種類 | 該当する型 |
|---|---|
| 基本データ型 | int |
| 参照型 | Integer、String、int[] |
intの変数は整数値そのものを持ちます。Integerの変数は、整数値を扱うIntegerオブジェクトへの参照、またはnullを持ちます。int[]は要素がintでも配列自体はオブジェクトなので、配列を扱う変数は参照型です。
問題2:List<Integer>へ直し、追加時にボクシングする
数量をまとめるためにList<int> quantitiesと書いたところ、コンパイルエラーになりました。どの型に直しますか。また、quantities.add(3)ではどのような変換が行われますか。
List<Integer> quantities = new ArrayList<>();
quantities.add(3);
ListとArrayListのimportを記述したメソッド内の例です。Listの型引数には基本データ型のintを指定できないため、対応するIntegerを指定します。add(3)では、intの3がIntegerへオートボクシングされます。
問題3:Integerで受け取り、nullを確認してから数値を使う
session.setAttribute("quantity", 3)で保存した値を取り出します。対応するラッパークラスは何ですか。また、その属性が未保存なのに、取得した値をそのままintへ変換するとどうなりますか。
intに対応するラッパークラスはIntegerです。setAttributeへ3を渡すと、Integerへボクシングされます。有効なsessionがある前提で、次のように受け取れます。
Integer quantity = (Integer) session.getAttribute("quantity");
属性が未保存ならquantityはnullです。nullをIntegerへキャストすること自体では例外になりませんが、その後intへアンボクシングしようとするとNullPointerExceptionになります。未保存時の処理と、値がある場合の計算を分けます。
回答例:有効なsessionから取得する処理
Integer quantity = (Integer) session.getAttribute("quantity");
if (quantity == null) {
System.out.println("数量が保存されていません");
} else {
int total = quantity * 500;
System.out.println(total);
}
問題4:aは4、bは3
Integer a = 3; Integer b = a; a = 4; の順に実行した後、aとbを表示するとそれぞれ何になりますか。参照型なのにbが変わらない理由も答えてください。
最初はaとbが数値3を表す同じIntegerを参照しています。a = 4では、aが数値4を表すIntegerを参照するようになります。数値3のオブジェクト内部を書き換えたのではなく、bの参照も変えていません。Integerの内部の数値は変更できないため、bは3のままです。
問題5:参照ではなく、Integerの数値を比較する
Integer同士の数量を==で比較する方法が不適切なのはなぜですか。左側に数値があるときだけ値の一致を確認したい場合、nullを考慮した判定をどう書きますか。
両辺がIntegerの==は、同じオブジェクトへの参照かを比較します。オブジェクトが再利用されてtrueになることがあっても、数値を比較する方法として頼ってはいけません。Integer同士の数値の一致にはequalsを使います。
boolean sameNumber = left != null && left.equals(right);
leftとrightをInteger型とする例です。leftがnullなら右側のequalsは実行されずfalseになります。leftに値があり、rightも同じ数値のIntegerならtrueです。両方nullの場合を「等しい数値」として扱う判定ではありません。