The initialization in the 1st case is a simple assignment of a constant value.  Nothing interesting... except that this is a primitive value that is being assigned, and primitive values don't have "identity"; i.e. all "copies" of the int value 20 are the same.
The 2nd and 3rd cases are a bit more interesting.  The 2nd form is using "boxing", and is actually equivalent to this:
Integer i = Integer.valueOf(20);
The valueOf method may create a new object, or it may return a reference to an object that existed previously.  (In fact, the JLS guarantees that valueOf will cache the Integer values for numbers in the range -128..+127 ...)
By contrast new Integer(20) always creates a new object.
This issue with new object (or not) is important if you are in the habit of comparing Integer wrapper objects (or similar) using ==.  In one case == may be true if you compare two instances of "20".  In the other case, it is guaranteed to be false.
The lesson: use .equals(...) to compare wrapper types not ==.
On the question of which to use:
- If iisint, use the first form.
- If iisInteger, the second form is best ... unless you need an object that is!=to other instances.  Boxing (or explicitly callingvalueOf) reduces the amount of object allocation for small values, and is a worthwhile optimization.