Integer i3 = Integer.valueOf(12);
Integer i4 = new Integer("12");
i4 is created using new operator and so when you compare it with other wrappers they are not same(meaning they are different)
with new operator you are constructing a new object so with new opeartor you will be creating new objects which will not be the same even if those 2 objects are constructed to hold same primitive values.. Do trial and error method while coding;; you will get to know..
but i5 and i6 are same as (check K&B for assistance)
i am just a learner ;; i hope you get a better view of this concept from experts;;;