Метод 2 трудно читаемый и вообще не имеет улучшений.
String
, созданный с помощью оператора оператора new
, он всегда создает новый объект в динамической памяти.String
, созданный с использованием String literal
, может вернуть существующий объект из String pool
, если он уже существует.
Он не вернет String
из пула и создаст String
с использованием new
оператор (источник Oracle JDK 10):
/**
* 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);
}
Если вы хотите определить String
константу, которая всегда будет загружаться из пула, просто создайте:
public static final String T = "T";
Из JLS
о строковых литералах и пулах:
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"; }
и блок компиляции:
package other;
public class Other {
public static String hello = "Hello";
}
производит вывод:
true true true true false true
Этот пример иллюстрирует шесть пунктов:
• Литеральные строки в одном и том же классе (§ 8 (классы)) в одном пакете (§ 7 (пакеты)) представляют ссылки на один и тот же объект String.(§4.3.1).
• Литеральные строки в разных классах в одном и том же пакете представляют ссылки на один и тот же объект String.
• Литеральные строки в разных классах в разных пакетах также представляют ссылки на один и тот же объект String.
• Строки, вычисленные с помощью константных выражений (§15.28), вычисляются во время компиляции, а затем обрабатываются так, как если бы они были литералами.
• Строки, вычисленные путем конкатенации во время выполнения, создаются заново и поэтому различаются.
• Результатом явного интернирования вычисленной строки является та же строка, что и любой ранее существовавшей литеральной строкой с таким же содержимым.