Method 2 is hard-readable and has no improvements at all.
String
created using new
operator operator, it always creates a new object in heap memory. String
created using String literal
may return an existing object from the String pool
, if it already exists.
It will not return a String
from the pool and creates a String
using new
operator (Oracle JDK 10 source):
/**
* Returns the string representation of the {@code char}
* argument.
*
* @param c a {@code char}.
* @return a string of length {@code 1} containing
* as its single character the argument {@code c}.
*/
public static String valueOf(char c) {
if (COMPACT_STRINGS && StringLatin1.canEncode(c)) {
return new String(StringLatin1.toBytes(c), LATIN1);
}
return new String(StringUTF16.toBytes(c), UTF16);
}
If you want to define a String
constant and that always will be loaded from the pool, just create a:
public static final String T = "T";
From JLS
about string literals and pools:
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
and the compilation unit:
package other;
public class Other {
public static String hello = "Hello";
}
produces the output:
true true true true false true
This example illustrates six points:
• Literal strings within the same class (§8 (Classes)) in
the same package (§7 (Packages)) represent references to the same
String object (§4.3.1).
• Literal strings within different classes in
the same package represent references to the same String object.
• Literal strings within different classes in different packages
likewise represent references to the same String object.
• Strings computed by constant expressions (§15.28) are computed at compile time and then treated as if they were literals.
• Strings computed by
concatenation at run time are newly created and therefore distinct.
• The result of explicitly interning a computed string is the same
string as any pre-existing literal string with the same contents.