はじめに
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
-
a
とb
はそれぞれ128
という値を持つInteger
オブジェクトです。 - しかし、
128
はキャッシュ範囲(-128
から127
)の外にあるため、a
とb
は異なるオブジェクトになります。 -
==
演算子はオブジェクトの参照を比較するため、異なるオブジェクトを指すa
とb
の比較結果はfalse
となります。
2. オブジェクトの値の比較
System.out.println(a.equals(b)); // true
-
equals
メソッドはオブジェクトの値を比較します。 -
a
とb
はどちらも128
という値を持つため、比較結果はtrue
となります。
3. キャッシュ範囲内のオブジェクト参照の比較
System.out.println(c == d); // true
-
c
とd
はそれぞれ127
という値を持つInteger
オブジェクトで、127
はキャッシュ範囲内の値です。 - キャッシュ範囲内の値は同じオブジェクトが再利用されるため、
c
とd
は同じオブジェクトを指します。 -
==
演算子はオブジェクトの参照を比較するため、同じオブジェクトを指すc
とd
の比較結果はtrue
となります。
4. キャッシュ範囲内のオブジェクトの値の比較
System.out.println(c.equals(d)); // true
-
equals
メソッドはオブジェクトの値を比較します。 -
c
とd
はどちらも127
という値を持つため、比較結果はtrue
となります。
5. プリミティブ型の比較
System.out.println(e == f); // true
-
e
とf
はプリミティブ型の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
クラスのキャッシュ機構とプリミティブ型の比較は、メモリ効率とパフォーマンスに重要な影響を与えます。キャッシュ範囲内の整数は同じオブジェクトを再利用し、範囲外の整数は新しいオブジェクトが生成されます。また、オートボクシングとアンボクシングにより、プリミティブ型とラッパークラスの間で自動的に変換が行われます。