Immutability
String instances have immutable values, i.e., their values cannot be changed after created.
String pool
String pool is one of the special constant pools maintained by the JVM. This pool keeps track of all the string literals used in the application.
When a new String instance is created by the string literal, e.g., String s = "hello";, the JVM looks into the pool to see if the same string literal has been created. If found, the JVM assigns the shared String object for the literal to the new instance, otherwise it records the new literal into the pool, creates a new String object, and assigns the new object to the new instance. This whole process is called string interning, and it can be enforced by calling String#intern() method.
However, string interning will not be applied if a String instance is created by the new operator, e.g., String s = new String("hello");, in which case a new String object is always created.
String concatenation
-
The overloading
+vs.StringBuilderUnder the hood, the compiler automatically creates a
StringBuilderwhen the overloading+is used to concatenate strings. But it is not smart enough to reuse theStringBuilder, for example, when the concatenation happens inside a loop, in which case it creates a newStringBuilderfor each iteration. This is the main reason whyStringBuilderis preferred over the overloading+operator. -
StringBuildervs.StringBuffer- Provide same API
StringBufferguarantees thread-safety by synchronizing all of its operations, whileStringBuilderdoes not.StringBuilderoffers a better performance because no synchronization is involved.
References
[1] Thinking in Java
[2] OCA/OCP Java® SE 7 Programmer I & II Study Guide (Exams 1Z0-803 & 1Z0-804)
[3] http://java-performance.info/string-intern-in-java-6-7-8/
[4] http://javatechniques.com/blog/string-equality-and-interning/