Integer i2 = 1;
This results is autoboxing. You are converting int(primitive type) to it's corresponding wrapper.
Integer i3 = new Integer(1);
Here no need of autoboxing as you are directly creating an Integer object.
Now in
i1 == i2
i1 == i3
i2 and i3 are automatically unboxed and regular int comparison takes place which is why you get true.
Now consider
i2 == i3
Here both i2 and i3 are Integer objects that you are comparing. Since both are different object(since you have used new operator) it will obviously give false. Note == operator checks if two references point to same object or not. Infact .equals() method if not overridden does the same thing.
It is same as saying
Integer i2 = new Integer(1);
Integer i3 = new Integer(1);
System.out.println("i2 == i3 "+(i2==i3));
which will again give you false.