Integers caching in Java [duplicate]
Possible Duplicate:
Weird Java Boxing
Recently I saw a presentation where was the following sample of Java code:
Integer a = 1000, b = 1000;
System.out.println(a == b); // false
Integer c = 100, d = 100;
System.out.println(c == d); // true
Now I'm a little confused. I understand why in first case the result is "false" - it is because Integer is a reference type and the references of "a" and "b" is different.
But why in second case the result is "true"?
I've heard an opinion, that JVM caching objects for int values from -128 to 127 for some optimisation purposes. In this way, references of "c" and "d" is the same.
Can anybody give me more information about this behavior? I want to understand purposes of this optimization. In what cases performance is increased, etc. Reference to some research of this problem will be great.
I want to understand purposes of this optimization. In what cases performance is increased, etc. Reference to some research of this problem will be great.
The purpose is mainly to save memory, which also leads to faster code due to better cache efficiency.
Basically, the Integer
class keeps a cache of Integer
instances in the range of -128 to 127, and all autoboxing, literals and uses of Integer.valueOf()
will return instances from that cache for the range it covers.
This is based on the assumption that these small values occur much more often than other ints and therefore it makes sense to avoid the overhead of having different objects for every instance (an Integer
object takes up something like 12 bytes).
Look at the implementation of Integer.valueOf(int)
. It will return the same Integer
object for inputs less than 256
.
EDIT:
It's actually -128
to +127
by default as noted below.
精彩评论