Использование строкового литерала создаст только один объект на время жизни JVM - или, возможно, загрузчик классов.(Я не могу вспомнить точные детали, но это почти никогда не важно.)
Это означает, что трудно сказать, что второе утверждение в вашем примере кода действительно «создает» объект - определенный объект должен бытьприсутствует, но если вы запустите один и тот же код в цикле 100 раз, он не будет создавать больше объектов ... тогда как первый оператор будет.(Для этого требуется, чтобы объект, на который ссылается литерал "ABC", присутствовал , а создавали новый экземпляр на каждой итерации в силу вызова конструктора.)
В частности, еслиу вас есть:
Object x = "ABC";
Object y = "ABC";
, тогда гарантировано (согласно спецификации языка), чем x
и y
будут ссылаться на один и тот же объект.Это распространяется и на другие константные выражения, равные той же самой строке:
private static final String A = "a";
Object z = A + "BC"; // x, y and z are still the same reference...
Единственный раз, когда я использую конструктор String(String)
, это когда у меня есть строка, которая может быть поддержана довольно большиммассив символов, который мне не нужен в противном случае:
String x = readSomeVeryLargeString();
String y = x.substring(5, 10);
String z = new String(y); // Copies the contents
Теперь, если строки, на которые ссылаются y
и x
, подходят для сбора, но строка, на которую ссылается z
, не соответствует (например, он передается другим методам и т. д.), поэтому мы не останавливаем всю оригинальную длинную строку в памяти, что было бы иначе.