Shouldn't I do `String s = new String(“a new string”);` in Java, even with automatic string interning?

StackOverflow https://stackoverflow.com//questions/10666537

Question

Ok, this question is an extension of this question

Java Strings: "String s = new String("silly");"

The above question asked the same question as this one, but I have a new doubting point.

According to Effective Java and the answers of above question, we should not do String s = new String("a new string");, because that will create unnecessary object.

I am not sure about this conclusion, because I think Java is doing automatic string interning, which means for a string, anyway there is only one copy of it in the memory.

So let's see String s = new String("a new string");.

"a new string" is already a string which has been created in the memory.

When I do String s = new String("a new string");, then the s is also "a new string". So according to automatic string interning, s should be pointed to the same memory address of "a new string", right?

Then how can we say we create unnecessary objects?

Was it helpful?

Solution


String a = "foo"; // this string will be interned
String b = "foo"; // interned to the same string as a
boolean c = a == b; //this will be true
String d = new String(a); // this creates a new non-interned String
boolean e = a == d; // this will be false
String f = "f";
String g = "oo";
String h = f + g; //this creates a new non-interned string
boolean i = h == a // this will be false
File fi = ...;
BufferedReader br = ...;
String j = br.readLine();
boolean k = a == j; // this will always be false. Data that you've read it is not automatically interned

OTHER TIPS

You may want to read more about String literal pool in JVMs. Quick googling pointed me to this article: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 which seems quite valid.

Also you may be interested in Integer literal pooling as well as other literals pooling in Java.

using "=" instead of "=new String" is better since it might result in a single instance instead of multiple instances.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top