最近、次のようなコード(Java)を見ました。
myMethod(new Integer(123));
現在、いくつかのコードをリファクタリングしていますが、Sonarツールには、次のようにsthを使用する方がよりメモリに優しいというヒントがあります。
myMethod(Integer.valueOf(123));
ただし、この場合、次を使用しても違いはないと思います。
myMethod(123);
メソッドに変数を渡すと、ハードコードされたintを理解できますか?または、Long/Doubleなどがあり、数値のLong表現が必要な場合。しかし、整数?
new Integer(123)
は、呼び出しごとに新しいObject
インスタンスを作成します。
javadoc によると、Integer.valueOf(123)
にはオブジェクトをキャッシュするという違いがあります。したがって、複数回呼び出すと、同じObject
になる可能性があります(またはそうでない場合もあります)。
たとえば、次のコード:
public static void main(String[] args) {
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println("a==b? " + (a==b));
Integer c = Integer.valueOf(1);
Integer d = Integer.valueOf(1);
System.out.println("c==d? " + (c==d));
}
次の出力があります。
a==b? false
c==d? true
int
値の使用に関しては、プリミティブ型を使用しています(メソッドがシグネチャでプリミティブ型も使用することを考慮してください)-メモリをわずかに使用し、高速になる場合がありますが、コレクションに追加することはできません、 例えば。
また、Javaの AutoBoxing を見てください。メソッドのシグネチャでInteger
-を使用する場合、JVMは自動的にInteger.valueOf()
を呼び出します(したがって、キャッシュも使用します)。
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以降、ブール値の単純なケースにすでに存在していました)。もちろん、これらはすべてJavaの不変オブジェクトです。以前は、intからIntegerオブジェクトが必要な場合、新しいIntegerを作成していました。しかし、JDK 5+では、Integerが-128〜127の整数オブジェクトをキャッシュし、毎回同じ正確なInteger(0)オブジェクトを毎回返すことができるため、valueOfを実際に使用する必要があります。まったく同じ整数オブジェクトでのオブジェクト構築
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);
}
refer なぜInteger.valueOf(int)を使用する必要があるのか
[〜#〜] edit [〜#〜]
オートボクシングとオブジェクト作成:
考慮しなければならない重要な点は、オートボクシングはオブジェクトの作成を減らすことではなく、コードの複雑さを減らすことです。良い経験則は、次の2つの理由から、オブジェクトが不要なプリミティブ型を使用することです。
プリミティブ型は、対応するラッパー型より遅くなることはなく、はるかに速くなる場合があります。 ==(参照の比較)および.equals()(値の比較)を含む予期しない動作が発生する可能性があります。
通常、プリミティブ型がラッパー型にボックス化されると、JVMはメモリを割り当てて新しいオブジェクトを作成します。ただし、特別な場合には、JVMは同じオブジェクトを再利用します。
以下は、不変オブジェクトとして保存されるプリミティブのリストです。
ブール値trueおよびfalse
すべてのバイト値
-128〜127の短い値
-128〜127の整数値
\ u0000から\ u007Fの範囲のchar
参照 http://today.Java.net/pub/a/today/2005/03/24/autoboxing.html#performance_issue
メソッドにはint
またはInteger
が必要ですか?
new Integer(int)
およびInteger.valueOf(int)
は両方ともInteger
オブジェクトを返しますが、valueOf
はキャッシュされたオブジェクトを返すため、より効率的であるため、優先されるべきです。メソッドにInteger
が必要な場合は、Integer.valueOf
。
メソッドでint
が必要な場合は、int
を使用する必要があります(例:123
)。
ただし、 autoboxing により、このように型を一致させる必要はありません。型が一致しない場合、int
をInteger
に自動的に変換します。一致します。これにより、int
をInteger
が必要なメソッドに渡し、Integer
をint
が必要なメソッドに渡すことができます。ただし、オートボクシングに関連するパフォーマンスコストがあることに注意してください。オートボクシングを使用する最も一般的な例は、コレクションにプリミティブを保存する場合です。
-128〜+127の範囲のみがキャッシュに実装されます。
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println("a==b? " + (a==b));
Integer c = Integer.valueOf(127);
Integer d = Integer.valueOf(127);
System.out.println("c==d? " + (c==d));
Integer e = Integer.valueOf(128);
Integer f = Integer.valueOf(128);
System.out.println("e==f? " + (e==f));
これを参照してくださいJava仕様:
http://Java.Sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7
jDK 5以降では、Integerは-128から127までのIntegerオブジェクトをキャッシュし、真新しい同一のIntegerオブジェクトでオブジェクト構築を無駄にする代わりに毎回同じ正確なInteger(0)オブジェクトを返すことができるため、valueOfを実際に使用する必要があります。
intはオブジェクトではなくプリミティブ型です。
new Integer(123)
とInteger.valueOf(123)
は両方とも値123を表すInteger
オブジェクトを返します。Integer.valueOf()
のjavadocに従って:
指定されたint値を表すIntegerインスタンスを返します。新しいIntegerインスタンスが不要な場合、このメソッドは一般的にコンストラクタInteger(int)よりも優先して使用する必要があります。このメソッドは、頻繁に要求される値をキャッシュすることにより、スペースと時間のパフォーマンスが大幅に向上する可能性が高いためです。