Вопрос, связанный со строкой - PullRequest
0 голосов
/ 29 августа 2011

У меня есть два утверждения:

String aStr = new String("ABC");
String bStr = "ABC";

Я прочитал в книге, что в первом утверждении JVM создает два объекта и одну ссылочную переменную, тогда как во втором утверждении создается одна ссылочная переменная и один объект.

Как так?Когда я говорю «новая строка» («ABC»), становится ясно, что объект создан.Теперь мой вопрос заключается в том, что для значения "ABC" мы создаем еще один объект?

Пожалуйста, уточните немного больше здесь.

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

Вы получите две строки.

1) литерал "ABC", используемый для построения aStr и присвоенный bStr.Компилятор гарантирует, что это тот же единственный экземпляр.

2) недавно сконструированная строка aStr (потому что вы заставили ее быть новой, что на самом деле довольно бессмысленно)

2 голосов
/ 29 августа 2011

Использование строкового литерала создаст только один объект на время жизни 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, не соответствует (например, он передается другим методам и т. д.), поэтому мы не останавливаем всю оригинальную длинную строку в памяти, что было бы иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...