It will create a new object on the heap, but not in the string pool.
From the API of String.intern():
Returns a canonical representation for the string object.
A pool of strings, initially empty, is maintained privately by the class String.
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.
All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification.
Using string literals will add those to the string pool automatically, and string literals are also retrieved from the string pool.
So with "String s2 = new String("hello")", it will fetch "hello" from the string pool, and use its contents to create a new object.