I'm sure this is answered elsewhere, but I'm too lazy to look it up --
When you declare a "string literal" in Java, that literal gets allocated as a Java String object during class loading of the containing class.  (And, incidentally, the String is "interned".)
So when you say String s = "Hello";, you're merely assigning a reference to the pre-existing String object to the variable s, and no matter how often in the program you do that assignment, you do not create any more instances of the String.
new String, on the other hand, always creates a new String object.
The char[] array in the String object is where the actual value of the String is stored.
(Note that a String is immutable -- you cannot change it once created.  When you assign a new value to as existing String reference, you are assigning a new object, not updating the existing String object.)