0
0

Javaの`Integer`クラスのキャッシュ機構とプリミティブ型の比較について

Posted at

はじめに

Javaプログラミングにおいて、Integerクラスのキャッシュ機構とプリミティブ型の比較は、パフォーマンスとメモリ効率に大きな影響を与える重要な概念です。本記事では、Integerクラスのキャッシュ機構、オートボクシング、プリミティブ型とラッパークラスの比較について見ていきます。

コード例

以下のコードを例に、それぞれの動作を説明していきます。

class Main {
    public static void main(String[] args) {
        Integer a = 128;
        Integer b = 128;
        Integer c = 127;
        Integer d = 127;
        int e = 127;
        int f = 127;

        System.out.println(a == b); // false
        System.out.println(a.equals(b)); // true
        System.out.println(c == d); // true
        System.out.println(c.equals(d)); // true
        System.out.println(e == f); // true
        // System.out.println(e.equals(f)); // プリミティブには使えません
    }
}

詳細解説

1. オブジェクト参照の比較

System.out.println(a == b); // false
  • abはそれぞれ128という値を持つIntegerオブジェクトです。
  • しかし、128はキャッシュ範囲(-128から127)の外にあるため、abは異なるオブジェクトになります。
  • ==演算子はオブジェクトの参照を比較するため、異なるオブジェクトを指すabの比較結果はfalseとなります。

2. オブジェクトの値の比較

System.out.println(a.equals(b)); // true
  • equalsメソッドはオブジェクトの値を比較します。
  • abはどちらも128という値を持つため、比較結果はtrueとなります。

3. キャッシュ範囲内のオブジェクト参照の比較

System.out.println(c == d); // true
  • cdはそれぞれ127という値を持つIntegerオブジェクトで、127はキャッシュ範囲内の値です。
  • キャッシュ範囲内の値は同じオブジェクトが再利用されるため、cdは同じオブジェクトを指します。
  • ==演算子はオブジェクトの参照を比較するため、同じオブジェクトを指すcdの比較結果はtrueとなります。

4. キャッシュ範囲内のオブジェクトの値の比較

System.out.println(c.equals(d)); // true
  • equalsメソッドはオブジェクトの値を比較します。
  • cdはどちらも127という値を持つため、比較結果はtrueとなります。

5. プリミティブ型の比較

System.out.println(e == f); // true
  • efはプリミティブ型のintで、どちらも127という値を持ちます。
  • プリミティブ型の比較では、==演算子は値そのものを比較するため、比較結果はtrueとなります。

6. プリミティブ型に対するequalsメソッドの使用

// System.out.println(e.equals(f)); // プリミティブには使えません
  • プリミティブ型にはメソッドがないため、equalsメソッドを使用することはできません。

キャッシュ機構の詳細

JavaのIntegerクラスには、特定の範囲内の整数値をキャッシュして再利用する機構があります。デフォルトで、このキャッシュ範囲は-128から127です。この範囲内の整数は頻繁に使用されるため、キャッシュによってメモリ使用量を削減し、パフォーマンスを向上させます。

キャッシュ範囲内の整数が再利用されるため、同じ値のIntegerオブジェクトは同一のインスタンスを指します。しかし、キャッシュ範囲外の整数は新たにインスタンス化されるため、異なるオブジェクトとなります。

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

Javaでは、プリミティブ型と対応するラッパークラスの間で自動的に変換が行われます。この機能をオートボクシング(プリミティブ型からオブジェクトへの変換)およびアンボクシング(オブジェクトからプリミティブ型への変換)と呼びます。

例:

Integer boxed = 127; // オートボクシング
int unboxed = boxed; // アンボクシング

まとめ

JavaのIntegerクラスのキャッシュ機構とプリミティブ型の比較は、メモリ効率とパフォーマンスに重要な影響を与えます。キャッシュ範囲内の整数は同じオブジェクトを再利用し、範囲外の整数は新しいオブジェクトが生成されます。また、オートボクシングとアンボクシングにより、プリミティブ型とラッパークラスの間で自動的に変換が行われます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0