There's a general advice to use Integer.valueOf(int)
instead of new Integer(int)
because of caching.
In JDK 5+, you should really use valueOf
because Integer
now caches Integer
objects between -128
and 127
and can hand you back the same exact Integer(0)
object every time instead of wasting an object construction on a brand new identical Integer
object.
How can extend the range?
My questions to you are:
1) Why is your code making new Integer objects hurting you? Do you have a profile result to share, to prove that making too many Integers is slowing your down? Object pooling, in general, is a BAD idea. You need a good case to justify it.
2) Why are you doing new Integer(int)? If you just keep it as a primitive int, not only will you avoid "creating a new object". you will not create any object at all. Auto boxing will handle converting it to an Integer if you need it at a later point in time.
*Disclaimer I Don't use EITHER.. I write performance sensitive code, but have never come to a point where I would manually turn a primitive int into an Integer. I just keep as an int whenever possible, and let the JVM autobox if it is needed.
Apparently, the -XX:+AggressiveOpts sets the max to 20000. See the answer on How large is the Integer cache?
Extending the range of the cache may not get you what you are wanting, but if you have a real need to cache a greater range, you can use this code instead of Integer.valueOf(int). You just need to adjust the cache range values to the range you want.
The code is from: http://www.owasp.org/index.php/Java_gotchas
You can use the java.lang.Integer.IntegerCache.high property to increase the size of this cache.
ex :
This is why the integer cache was added:
If you profiled your app and you noticed that creating Integer objects is a hotspot, then by all means, copy the integer cache code and write your own with a different range. Otherwise your time would be better spent finding the real hotspots and improving those.