В Java строки неизменны, так что же происходит, когда это делается? - PullRequest
1 голос
/ 25 марта 2012
String s;
/*code*/
s = "foo";

Создается ли новый объект, поскольку пустая строка не может быть изменена?

Ответы [ 3 ]

6 голосов
/ 25 марта 2012

Это:

String s;

не создает «пустую строку», это просто неинициализированная переменная.

Это:

s = "foo";

устанавливает эту переменную для ссылки на String объект. Это неизменяемый объект, а не переменная.

5 голосов
/ 25 марта 2012

Вам необходимо понять разницу между переменными и объектами .

Рассмотрим этот код:

String x = "hello";
for (int i = 0; i < 10; i++) {
    x = x + i;
}

В результате будет создано 11 строк объектов , но задействованы только две переменные (x и i). В любой момент значение из i является целым числом (0-10), а значение из x является ссылкой на String. (Это также может быть null, но в данном примере это не так.)

Важно понимать, что x не является объектом, а также значение из x не является объектом.

Если это помогает думать об этом в физическом смысле, рассмотрите лист бумаги с моим домашним адресом:

  • Лист бумаги похож на переменную - это «где-то значение может быть сохранено».
  • Адрес, написанный на листе бумаги, похож на ссылку - это способ найти объект
  • Сам дом похож на объект.

Ни листок бумаги, ни адрес не являются самим домом. Если вы стираете адрес на бумаге и вместо этого пишете другой адрес, это не вносит никаких изменений в мой дом - точно так же, как изменение значения x не вносит никаких изменений в сами строковые объекты в моем примере код.

2 голосов
/ 25 марта 2012

s в настоящее время вообще ничего не назначено.

Но если у вас есть - если вы определили String s = "";, а затем s = "foo";, то пустая строка не изменится, а переменная s изменится на , ссылается на строку "foo" вместо пустой строки.

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