String s1 = "abc";
variable s1 will refer to the string literal hi that is referenced from String constant pool and if we talk about
String s2 = s1;
they both are referring to the same value stored at String pool.
String s3 = new String("abc");
This will create a new String at runtime.
In first case ,all the string literals are created when class is loaded in JVM In seconds case, string objects are created when new String() is executed.
String s4 = s3;
they both are referring to the same object stored at heap.
You can find a good tutorial about string constant pool at following link
http://www.thejavageek.com/2013/06/19/the-string-constant-pool/