ジョシュア・ブロックの効果的なJava項目5:「不要なオブジェクトの作成を避ける」で、彼は次のコード例を投稿します。
public static void main(String[] args) {
Long sum = 0L; // uses Long, not long
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
実行には43秒かかります。Longをプリミティブに取り込むと、6.8秒に短縮されます...それが何らかの理由でプリミティブを使用する理由である場合。
ネイティブバリューの平等の欠如も懸念事項です(.equals()
と比較するとかなり冗長です)。==
)
ビジクロップの場合:
class Biziclop {
public static void main(String[] args) {
System.out.println(new Integer(5) == new Integer(5));
System.out.println(new Integer(500) == new Integer(500));
System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}
}
結果:
false
false
true
false
編集 なぜ(3)戻るtrue
と(4)戻るかfalse
ですか?
2つの異なるオブジェクトだからです。ゼロに最も近い256の整数[-128; 127]はJVMによってキャッシュされるので、それらは同じオブジェクトを返します。ただし、その範囲を超えると、キャッシュされないため、新しいオブジェクトが作成されます。物事をより複雑にするために、JLS は少なくとも 256のフライウェイトがキャッシュされることを要求します。JVMの実装者は、必要に応じてさらに追加することがあります。これは、最も近い1024がキャッシュされ、すべてがtrueを返すシステムで実行できることを意味します... #awkward