No, with String s = "lol";, only one object is created.  With every string literal, a String object is created and placed in the string pool.  Here, s just refers to that pooled string.  When you say s = new String("lol"), the string literal is created and pooled, and another string is allocated and assigned to s, which is a different, yet equal, string.
UPDATE
I had forgotten about the char[] that is used internally by a String object.
String s1 = "lol";
2 objects are created, the char[] that holds {'l', 'o', 'l'} and the String object that references it internally.  It's interned in the string pool.
String s2 = new String("lol");
3 objects are created.  First, the string literal: 2 objects are created, the char[] that holds {'l', 'o', 'l'} and the String object that references it.  It's interned in the string pool as before.  Then, the new String object that gets assigned to s2: A new String is created, but it references the same char array as the original string.  Two String objects, and one char[] object.  (The String(String) constructor may make a copy of the char[] in the circumstance that the original string's array's length is somehow greater than its count, but that doesn't appear to be the case here.)