Java | 基礎文法:ラッパークラス

Java Java
スポンサーリンク

ラッパークラスの全体像

ラッパークラスは、プリミティブ型(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(アンボクシング時に発生)
Java

null をアンボクシングすると例外になるため、必ず 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
Java

null を許容するなら、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 の方針を決め、誤用を防ぐ——この習慣が、堅牢で読みやすい数値処理を支えます。

タイトルとURLをコピーしました