public static Integer valueOf(int i)
指定された int 値を表す Integer インスタンスを返します。新しい Integer インスタンスが必要ない場合は、コンストラクター Integer(int) よりもこのメソッドを優先して使用する必要があります。このメソッドは、頻繁に要求される値をキャッシュすることによって、空間と時間のパフォーマンスが大幅に向上する可能性が高いためです。
パラメータ:
i
- int 値。
戻り値:
a
を表す整数インスタンスi
。
以降:
1.5
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#valueOf%28int%29を参照してください
valueOf のこのバリアントは、JDK 5 で Byte、Short、Integer、および Long に追加されました (これは、JDK 1.4 以降、Boolean の単純なケースで既に存在していました)。もちろん、これらはすべて Java の不変オブジェクトです。以前は、int から Integer オブジェクトが必要な場合は、新しい Integer を構築していました。しかし、JDK 5 以降では、実際に valueOf を使用する必要があります。これは、Integer が -128 から 127 の間の Integer オブジェクトをキャッシュし、まったく同じ Integer(0) オブジェクトをまったく新しいオブジェクトで構築するのを無駄にする代わりに、毎回同じ正確な Integer(0) オブジェクトを返すことができるためです。 .
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
Integer.valueOf(int) を使用する理由を参照してください
編集
オートボクシングとオブジェクト作成:
考慮しなければならない重要な点は、オートボクシングはオブジェクトの作成を減らすのではなく、コードの複雑さを減らすということです。経験則として、オブジェクトを必要としないプリミティブ型を使用することをお勧めします。これには次の 2 つの理由があります。
プリミティブ型は、対応するラッパー型よりも遅くはなく、はるかに高速になる可能性があります。== (参照の比較) と .equals() (値の比較) に関連する予期しない動作が発生する可能性があります。
通常、プリミティブ型がラッパー型にボックス化されると、JVM はメモリを割り当て、新しいオブジェクトを作成します。ただし、一部の特殊なケースでは、JVM は同じオブジェクトを再利用します。
以下は、不変オブジェクトとして格納されるプリミティブのリストです。
ブール値 true および false
すべてのバイト値
-128 から 127 までの短い値
-128 ~ 127 の int 値
\u0000 から \u007F の範囲の文字
http://today.java.net/pub/a/today/2005/03/24/autoboxing.html#performance_issueを参照