While looking at online code samples, I have sometimes come across an assignment of a String constant to a String object via the use of the new operator.
For example:
String s; ... s = new String('Hello World');
This, of course, compared to
s = 'Hello World';
I’m not familiar with this syntax and have no idea what the purpose or effect would be. Since String constants typically get stored in the constant pool and then in whatever representation the JVM has for dealing with String constants, would anything even be allocated on the heap?
The one place where you may think you want
new String(String)is to force a distinct copy of the internal character array, as inHowever, this behavior is unfortunately undocumented and implementation dependent.
I have been burned by this when reading large files (some up to 20 MiB) into a String and carving it into lines after the fact. I ended up with all the strings for the lines referencing the char[] consisting of entire file. Unfortunately, that unintentionally kept a reference to the entire array for the few lines I held on to for a longer time than processing the file – I was forced to use
new String()to work around it, since processing 20,000 files very quickly consumed huge amounts of RAM.The only implementation agnostic way to do this is:
This unfortunately must copy the array twice, once for
toCharArray()and once in the String constructor.There needs to be a documented way to get a new String by copying the chars of an existing one; or the documentation of
String(String)needs to be improved to make it more explicit (there is an implication there, but it’s rather vague and open to interpretation).Pitfall of Assuming what the Doc Doesn’t State
In response to the comments, which keep coming in, observe what the Apache Harmony implementation of
new String()was:That’s right, no copy of the underlying array there. And yet, it still conforms to the (Java 7) String documentation, in that it:
The salient piece being ‘copy of the argument string‘; it does not say ‘copy of the argument string and the underlying character array supporting the string’.
Be careful that you program to the documentation and not one implementation.