【プログラミングしてみよう75】JavaのintとIntegerの違い(プリミティブ型とラッパークラス)

Java

前回はArraysクラスの使い方を学びました。

今回は「プリミティブ型とラッパークラス」について解説します。int と Integer の違いを理解することで、コレクションの使い方やnullの扱いが明確になります。

プリミティブ型とラッパークラス

Javaには2種類の型があります。

プリミティブ型   ラッパークラス
int          → Integer
double       → Double
boolean      → Boolean
char         → Character
long         → Long

プリミティブ型は値そのものを直接保持し、ラッパークラスはオブジェクトとして値を包みます。コレクション(List<Integer> など)にはオブジェクトしか入れられないためラッパークラスが必要です。

オートボクシングとアンボクシング

Java 5以降、プリミティブ型とラッパークラスは自動変換されます。

int i = 42;
Integer obj = i;   // オートボクシング(int → Integer)
int j = obj;       // アンボクシング(Integer → int)

サンプルコード

ファイル作成

「Java63」フォルダに WrapperTest.java という名前でファイルを作成します

コード入力

import java.util.ArrayList;
import java.util.List;

public class WrapperTest {
    public static void main(String[] args) {
        // オートボクシング・アンボクシング
        int primitive = 42;
        Integer wrapper = primitive;        // オートボクシング
        int back = wrapper;                 // アンボクシング
        System.out.println("primitive: " + primitive);
        System.out.println("wrapper: "   + wrapper);

        // nullが扱える(プリミティブ型はnull不可)
        Integer nullable = null;
        System.out.println("nullable: " + nullable);

        // == と equals の違い
        Integer a = 127;
        Integer b = 127;
        Integer c = 128;
        Integer d = 128;
        System.out.println("\n127 == 127: " + (a == b));       // true (キャッシュ範囲)
        System.out.println("128 == 128: " + (c == d));         // false (別オブジェクト)
        System.out.println("128 equals 128: " + c.equals(d)); // true (値比較)

        // ラッパークラスの便利メソッド
        System.out.println("\n--- 便利メソッド ---");
        System.out.println("parseInt: "   + Integer.parseInt("42"));
        System.out.println("toBinary: "   + Integer.toBinaryString(10));
        System.out.println("toHex: "      + Integer.toHexString(255));
        System.out.println("MAX_VALUE: "  + Integer.MAX_VALUE);
        System.out.println("MIN_VALUE: "  + Integer.MIN_VALUE);

        // コレクションにはラッパークラスが必要
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1); // オートボクシングで自動変換
        numbers.add(2);
        numbers.add(3);
        int sum = numbers.stream().mapToInt(Integer::intValue).sum();
        System.out.println("\nリストの合計: " + sum);

        // NullPointerExceptionに注意
        System.out.println("\n--- NPEに注意 ---");
        Integer nullInt = null;
        try {
            int value = nullInt; // アンボクシング時にNPE発生
        } catch (NullPointerException e) {
            System.out.println("NPE発生: アンボクシング時にnullは不可");
        }
    }
}

コンパイル

javac WrapperTest.java

実行

java WrapperTest

実行結果は次のようになります。

primitive: 42
wrapper: 42
nullable: null

127 == 127: true
128 == 128: false
128 equals 128: true

--- 便利メソッド ---
parseInt: 42
toBinary: 1010
toHex: ff
MAX_VALUE: 2147483647
MIN_VALUE: -2147483648

リストの合計: 6

--- NPEに注意 ---
NPE発生: アンボクシング時にnullは不可

ポイントまとめ

・コレクションにはラッパークラスが必要
・Integer同士の比較は == でなく equals() を使う
・-128〜127のIntegerは同じオブジェクトがキャッシュされる
・nullのIntegerをアンボクシングするとNPEが発生する

まとめ

int は値そのもの、Integer はオブジェクトです。オートボクシングで自動変換されますが、== での比較やnullのアンボクシングには注意が必要です。コレクションを使う場面でラッパークラスが必要になることを覚えておきましょう。

2026/08/23(日) ぱんまる

コメント

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