java == for Integer [duplicate]
Asked Answered
G

2

9

Possible Duplicate:
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 127?

I have found the following == behaviour for Integer objects and I fail to understand it. (I am well aware that one should use equals for such comparisons, but I am studying for OCPJP...)

On short, == works as expected for 1000, but not for 10.

The former fragment of code is:

Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different objects");
if(i1.equals(i2)) System.out.println("meaningfully equal");

and it behaves as one would expect:

different objects
meaningfully equal

The latter though:

Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same object");
if(i3.equals(i4)) System.out.println("meaningfully equal"); 

has the following output:

same object
meaningfully equal

Can someone please explain why this is happening?

Glade answered 17/2, 2012 at 11:13 Comment(1)
BTW Try with -XX:+AggressiveOpts and the first one will behave as the second, as it increases the size of the Integer cache. ;)Conchiferous
S
12

Since Java 5, wrapper class caching was introduced. The following is an examination of the cache created by an inner class, IntegerCache, located in the Integer cache. For example, the following code will create a cache:

Integer myNumber = 10

or

Integer myNumber = Integer.valueOf(10);

256 Integer objects are created in the range of -128 to 127 which are all stored in an Integer array. This caching functionality can be seen by looking at the inner class, IntegerCache, which is found in Integer:

So when creating an object using Integer.valueOf or directly assigning a value to an Integer within the range of -128 to 127 the same object will be returned. Therefore, consider the following example:

Integer i = 100;
Integer p = 100;
if (i == p)  
    System.out.println("i and p are the same.");
if (i != p)
    System.out.println("i and p are different.");   
if(i.equals(p))
    System.out.println("i and p contain the same value.");

The output is:

i and p are the same.
i and p contain the same value.

It is important to note that object i and p only equate to true because they are the same object, the comparison is not based on the value, it is based on object equality. If Integer i and p are outside the range of -128 or 127 the cache is not used, therefore new objects are created. When doing a comparison for value always use the “.equals” method. It is also important to note that instantiating an Integer does not create this caching.

Remember that “==” is always used for object equality, it has not been overloaded for comparing unboxed values

Sebastiansebastiano answered 17/2, 2012 at 11:22 Comment(0)
L
10

See Integer wrapper objects share the same instances only within the value 127?. The Integer class keeps shared static instances around for common values.

Lionellionello answered 17/2, 2012 at 11:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.