由於緩存的原因,我們建議使用Integer.valueOf(int)
而不是new Integer(int)
。擴展java Integer緩存
在JDK 5+,你應該使用valueOf
因爲Integer
現在緩存-128
和127
之間Integer
對象,可以交給你回來完全相同Integer(0)
對象每次而不是一個全新的相同Integer
對象浪費了一個對象的建設。
如何擴展範圍?
由於緩存的原因,我們建議使用Integer.valueOf(int)
而不是new Integer(int)
。擴展java Integer緩存
在JDK 5+,你應該使用valueOf
因爲Integer
現在緩存-128
和127
之間Integer
對象,可以交給你回來完全相同Integer(0)
對象每次而不是一個全新的相同Integer
對象浪費了一個對象的建設。
如何擴展範圍?
我的問題,你是:
1)爲什麼你的代碼作出新的Integer對象傷害你?你有沒有要分享的個人資料結果,以證明製作太多的整數會讓你失望?總的來說,對象池是一個糟糕的想法。你需要一個好的案例來證明它的合理性。
2)爲什麼你在做新的整數(int)?如果你只是把它保持爲一個原始的int,你不僅會避免「創建一個新的對象」。你根本不會創建任何對象。如果您稍後需要它,自動裝箱會將其轉換爲整數。
*免責聲明我不使用..我寫性能敏感的代碼,但從來沒有到一個點,我會手動將原始int轉換爲整數。只要有可能,我就保持爲int,如果需要的話,讓JVM自動裝箱。
擴展緩存的範圍可能不會讓你得到你想要的,但是如果你真的需要緩存更大的範圍,你可以使用這個代碼而不是Integer.valueOf(int)。您只需將緩存範圍值調整到您想要的範圍。
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);
}
可以使用java.lang.Integer.IntegerCache.high屬性來增加這個緩存的大小。
例如:
java -Djava.lang.Integer.IntegerCache.high=4096 SomeClass.class
This is why the integer cache was added:
[...],以支持自動裝箱爲-128和127(含)之間的值的對象標識語義所要求的語言規範。
如果您對應用程序進行了剖析並且發現創建Integer對象是一個熱點,那麼請務必複製整數高速緩存代碼並使用不同的範圍編寫自己的代碼。否則你的時間會更好地花在尋找真正的熱點並改進它們。
顯然,-XX:+ AggressiveOpts設置最高至20000參見How large is the Integer cache?
答案雖然你沒有明確回答OP的問題,我100%在這裏與你同意。彙集這樣的「便宜」對象幾乎肯定是一個壞主意。 – Waldheinz 2010-10-14 14:55:30