ラッパークラスの全体像
ラッパークラスは、プリミティブ型(int、long、double など)をオブジェクトとして扱うためのクラス群です。代表は Integer、Long、Double、Float、Short、Byte、Character、Boolean。コレクションやジェネリクスは参照型しか持てないため、ラッパーが必要になります。ラッパーは不変(immutable)で、値の比較・変換・パース・整形などの実用メソッドを備えています。
基本とオートボクシング/アンボクシング
参照型としての値の受け渡し
プリミティブは値そのもの、ラッパーは参照として扱われます。コレクションに数値を入れるにはラッパーを使います。
java.util.List<Integer> nums = java.util.List.of(1, 2, 3);
Java自動変換(オートボクシング/アンボクシング)
プリミティブとラッパーは多くの場面で自動変換されます。代入、算術、比較で自然に行われますが、null が混ざると危険です。
Integer ix = 10; // ボクシング(int → Integer)
int n = ix; // アンボクシング(Integer → int)
Integer nx = null;
// int m = nx; // NullPointerException(アンボクシング時に発生)
Javanull をアンボクシングすると例外になるため、必ず null ガードを入れるか、既定値で置き換えます。
int safe = (nx != null) ? nx : 0;
Java値の比較と等価性(重要ポイントの深掘り)
== と equals の違い
ラッパーは参照型なので、== は参照比較、equals は値比較です。値を比較するなら equals を使います。
Integer a = 128, b = 128;
System.out.println(a == b); // false(別参照)
System.out.println(a.equals(b)); // true(値が等しい)
Javaキャッシュと誤解の回避
Integer や他の一部ラッパーは小さい値をキャッシュすることがあります(典型的に -128〜127)。この範囲では == が true に見えることがあり、コードの一貫性を壊します。常に equals で比較すれば安全です。
Integer x = 127, y = 127;
System.out.println(x == y); // true に見える場合あり(キャッシュ)
System.out.println(x.equals(y)); // true(常に安全)
Java変換・パース・整形の基本メソッド
文字列 ⇔ 数値の変換
文字列を数値にするには parseXXX、文字列化は toString または String.valueOf を使います。入力検証のため、例外ハンドリングやトリムを組み合わせます。
int v = Integer.parseInt("123"); // 123
double d = Double.parseDouble("3.14"); // 3.14
String s = String.valueOf(456); // "456"
Java数値のフォーマットは String.format を使うと見やすく整えられます。
String label = String.format(java.util.Locale.JAPAN, "%,d円", 1234567);
Java値取り出しと他型への変換
ラッパーは各種プリミティブへの取り出しメソッドを持っています。意味のある範囲・精度に注意して使います。
Integer ix = 100;
long lv = ix.longValue();
double dv = ix.doubleValue();
Java生成とキャッシュ、パフォーマンスの勘所(重要ポイントの深掘り)
valueOf と new の違い
valueOf は内部キャッシュを使うため、軽量で再利用されることがあります。new は毎回別インスタンスになります。通常は valueOf(またはオートボクシング)で十分です。
Integer a = Integer.valueOf(10); // 推奨
Integer b = new Integer(10); // 非推奨(古い書き方・冗長)
Javaパフォーマンスとボクシングのコスト
大量ループでボクシング/アンボクシングが頻発すると、オブジェクト生成と GC が増えます。可能ならプリミティブを使い、コレクションが必要なら特化型(OptionalInt、IntStream、TIntArrayList などのプリミティブ指向APIやライブラリ)を検討します。
int sum = java.util.stream.IntStream.of(1,2,3).sum(); // ボクシングなし
Java比較・並び替え・境界値の扱い
比較と順序付け
ラッパーは Comparable を実装しており、自然順序で比較できます。null を含む並び替えでは Comparator で null セーフにするか、事前フィルタします。
java.util.List<Integer> list = new java.util.ArrayList<>(java.util.List.of(3, 1, 2));
list.sort(Integer::compareTo); // 1, 2, 3
Javanull を許容するなら、Comparator.nullsFirst/nullsLast を使います。
list.sort(java.util.Comparator.nullsLast(Integer::compareTo));
Java境界値と定数
各ラッパーは最小・最大値の定数を持ちます。縮小変換やキャスト前の検証に活用できます。
int min = Integer.MIN_VALUE; // -2147483648
int max = Integer.MAX_VALUE; // 2147483647
Javaラッパーとプリミティブの設計指針(重要ポイントの深掘り)
いつラッパーを使うか
コレクション、ジェネリクス、null を意味として使いたい場面ではラッパーが必要です。計算中心で null を許容しない場面はプリミティブを選び、ボクシングのコストを避けます。API の契約として「null を返すか、Optional を返すか、既定値にするか」を事前に決めておくと誤用が減ります。
null の扱いを明確化する
ラッパーは「値がない」を null で表現できますが、アンボクシングで例外になりやすいのが弱点です。呼び出し側が扱いやすいように Optional や既定値を用意する設計が有効です。
java.util.Optional<Integer> find(String s) {
try { return java.util.Optional.of(Integer.parseInt(s.trim())); }
catch (NumberFormatException e) { return java.util.Optional.empty(); }
}
Java例題で身につける
例 1: 入力を安全にパースして合計する
public class ParseSum {
public static void main(String[] args) {
String[] xs = {"10", " 20 ", "abc", "30"};
int sum = 0;
for (String x : xs) {
try {
sum += Integer.parseInt(x.trim());
} catch (NumberFormatException e) {
// 無視(またはログ)
}
}
System.out.println(sum); // 60
}
}
Java例 2: null セーフな値比較と並び替え
import java.util.*;
public class SortSafe {
public static void main(String[] args) {
List<Integer> xs = new ArrayList<>(List.of(3, null, 1, 2));
xs.sort(Comparator.nullsLast(Integer::compareTo));
System.out.println(xs); // [1, 2, 3, null]
}
}
Java例 3: ボクシングを避けた集計(性能優先)
public class SumFast {
public static void main(String[] args) {
int sum = java.util.stream.IntStream.rangeClosed(1, 1_000_000).sum();
System.out.println(sum);
}
}
Java仕上げのアドバイス(重要部分のまとめ)
ラッパークラスは「参照型の世界で数値を扱うための橋」です。自動変換は便利ですが、null のアンボクシング例外と == の罠に注意し、比較は equals を徹底する。生成は valueOf(またはオートボクシング)を用い、パース・整形の標準メソッドで意図を明確化する。性能が重要ならプリミティブ中心に設計し、コレクションやストリームではプリミティブ特化APIを選ぶ。API契約で null と Optional の方針を決め、誤用を防ぐ——この習慣が、堅牢で読みやすい数値処理を支えます。
