Win a copy of The Way of the Web Tester: A Beginner's Guide to Automating Tests this week in the Testing forum!

# Integer int question

Gary Kevin
Ranch Hand
Posts: 43
source:http://enigma.vm.bytemark.co.uk/webstart.html
John Meyers's SCJP 5 mock exam:question 7

lthree and lfour are two seperate objects. if the lines 1 and 2 were lthree = 2 and lfour = 2 the result would have been true. This is when the objects are created in the pool. When the references i and eye in the pool are compared 2==2 results in true and 2000==2000 is false since it exceeds 127.

I thought the answer would be false flase false
why number smaller than 128 get true?they are wrapped, they should be different objects.

Tarun Kumar
Greenhorn
Posts: 26
This is because integer from -128 to 127 are cached by the Intger class.
so when a int within this range is created it is retrived from cache rather than creating a new Inetegr object.

You can find the cache for Integer class...
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);
}
}

Gary Kevin
Ranch Hand
Posts: 43
Originally posted by Tarun Kumar:
This is because integer from -128 to 127 are cached by the Intger class.
so when a int within this range is created it is retrived from cache rather than creating a new Inetegr object.

You can find the cache for Integer class...
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);
}
}

Tarun:Thinks very much!

I have seen the source code of Integer class.
[CODE
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);
}
}

/**
* Returns a <tt>Integer</tt> instance representing the specified
* <tt>int</tt> value.
* If a new <tt>Integer</tt> instance is not required, this method
* should generally be used in preference to the constructor
* {@link #Integer(int)}, as this method is likely to yield
* significantly better space and time performance by caching
* frequently requested values.
*
* @param i an <code>int</code> value.
* @return a <tt>Integer</tt> instance representing <tt>i</tt>.
* @since 1.5
*/
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);
}
[/CODE]

It defines an statci inner class and only uses it in method valueOf,Is that means when we invoke

JVM wrap the int to Integer just like this:

JVM implictly invokes The Integer's method valueOf?