String first = "abc";
String second = new String("abc");
In first case there is only one object will create in Pool.
In second case two object will create one in pool (if this is not existing previously in Pool) and one in heap.
When you are passing any value with double quote ex: "abc" you are creating a object in pool and passing it to the string constructor for creating a new object with the same value in heap.
If you saw the string constructor you can see that it accept a string. What is that string? Before creation what is that string object. It's nothing but an object stored in String Constant pool.