The wrapper classes for the base types are present in a reduced form. Code like
Integer intObj = new Integer(15);
translates to Bytecode
new java/lang/Integer dup bipush 15 invokespecial java/lang/Integer(int): void astore_0 [intObj]
First an Integer object is created and its constructor is called. It initializes the value to 15.
With auto boxing it's possible to simply write
Integer intObj = 15;
This leads to
bipush 15 invokestatic java/lang/Integer.valueOf(int): Ljava/lang/Integer; astore_0 [intObj]
In this case the static method valueOf is called, which also creates an Integer object. Indeed, in the class Integer of the standard library for all small Integer values objects are preallocated and a simple reference to one of this is returned. A call to valueOf for small values is therefore very efficient. In our implementation of the runtime system we omit this cache.