Java Autoboxing through a method

171 views Asked by At

Let's say that I have a class:

class A {
  private Integer i;

  public int getI() {
    return i;
  }

  // Setter, etc.
}

and I write:

A a = // initializer

Integer b = a.getI();

how many Integers will there be? My naive reading about autoboxing/unboxing leads me to believe that the answer is 2, but if getI() were:

public Integer getI();

then the answer would be 1.

2

There are 2 answers

2
Sergey Kalinichenko On BEST ANSWER

You are absolutely correct, with one caveat: the answer to the first part depends on the value of Integer i.

  • In the first scenario, one Integer is created in the constructor, and the other one is created when boxing the int coming from getI()
  • In the second scenario, there needs to be no boxing, so there's only one Integer object.

Note: if the value of the Integer i is small (more precisely, between -128 and 127, inclusive), autoboxing will produce the same Integer through interning.

3
Tim B On

Correct....ish

It's theoretically possible the Compiler/JIT/JVM/etc could optimise out the autoboxing but I've no idea if it actually would.

It's also possible the same Integer object would be re-used. For example Integer.valueOf(2) is guaranteed to give you the same Integer object every time you call it and re-use the same object. This is only guaranteed for values in the range -128 to +127 inclusive though, it may happen outside that range but should not be relied upon.