Hey I am trying to understand the following code snippet.
public static void main(String[] args) {
Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different objects");
if(i1.equals(i2)) System.out.println("meaningfully equal");
Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) Sy开发者_运维问答stem.out.println("same object");
if(i3.equals(i4)) System.out.println("meaningfully equal");
}
This method runs all of the println instructions. That is i1 != i2 is true, but i3 == i4. At first glance this strikes me as strange, they should be all different as references. I can figure out that if I pass the same byte value (-128 to 127) to i3 and i4 they will be always equal as references, but any other value will yield them as different.
I can't explain this, can you point me to some documentation or give some helpful insights?
Thank you
Autoboxing int
values to Integer
objects will use a cache for common values (as you've identified them). This is specified in the JLS at §5.1.7 Boxing Conversion:
If the value
p
being boxed istrue
,false
, abyte
, achar
in the range\u0000
to\u007f
, or anint
orshort
number between-128
and127
, then letr1
andr2
be the results of any two boxing conversions ofp
. It is always the case thatr1 == r2.
Note that this will only be applied when the language auto-boxes a value for you or when you use Integer.valueOf()
. Using new Integer(int)
will always produce a new Integer
object.
Minor hint: a JVM implementation is free to cache values outside of those ranges as well, because the opposite is not specified. I've not yet seen such an implementation, however.
Java keeps a pool of Integer between -128 and 128. If you use Integer outside of this range, new Integer objects are created. That's the explanation.
Here you can see it in the Java source code:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Integers from -128 to 127 are wrapped into fixed objects. That's why you get i3 == i4.
精彩评论