Разве строковые объекты в Java не неизменны? [дубликат]

6
задан Brandon 3 August 2010 в 15:34
поделиться

7 ответов

Строковые объекты неизменяемы. Однако ссылки на строки являются изменяемыми. Выше s - ссылка.

24
ответ дан 8 December 2019 в 02:26
поделиться

Строковые объекты неизменяемы, что означает, что значение экземпляра , на которое ссылаются s , не может измениться.

Ваш код не изменяет экземпляр.
Вместо этого он изменяет ссылку s для ссылки на новый экземпляр строки.

Например:

String a = "1";
String b = a;
a = "2";

После выполнения этого кода b по-прежнему «1» .
Строка b = a устанавливает b для ссылки на тот же «1» экземпляр, к которому в настоящее время относится a .
Когда вы впоследствии пишете a = "2" , вы меняете переменную a для ссылки на другой ( «2» ) экземпляр.
Однако исходный экземпляр «1» , к которому все еще относится b , не изменился.

5
ответ дан 8 December 2019 в 02:26
поделиться

Да, String объекты неизменяемы.

Переменная s является ссылкой на объект, и сама ссылка может иметь объект, который она указывает, на изменение - переназначение ссылки не влияет на объект, на который она указывает.

Метод String.substring фактически возвращает новый экземпляр String , поэтому исходный объект String остается нетронутым.

Ниже приводится простой пример, показывающий, что исходная String не изменяется методом substring ::

String s = "Hello!";
s.substring(1);

System.out.println(s);   // Prints "Hello!"

В приведенном выше примере будет напечатано «Hello!» потому что метод substring вернет новую String , а не повлияет на исходную. Исходная Строка не может быть изменена, потому что она неизменяема.

Сравните приведенное выше со следующим:

String s = "Hello!";
s = s.substring(1);

System.out.println(s);   // Prints "ello!"

В этом примере ссылка на s изменена на String , возвращаемую методом substring , поэтому, когда строка , связанная с s , печатается «System.out.println», выводимая строка будет «привет!»

4
ответ дан 8 December 2019 в 02:26
поделиться

Здесь вы создаете новую строку и назначаете ее ранее использованной ссылке. Исходная строка, о которой идет речь, является сборщиком мусора. Фактически никакие струны не изменились.

2
ответ дан 8 December 2019 в 02:26
поделиться

Итак:

String foo = "foo";
foo.substring(1);
System.out.println(foo);

//of course..
foo = "aa";
System.out.println(foo);
0
ответ дан 8 December 2019 в 02:26
поделиться

Когда вы используете String s = "abc", вы создаете ссылку String на объект String, который имеет неизменяемое значение "abc".

Затем, когда вы говорите s = s.substring (1);, вы назначаете s вновь созданному объекту String, содержащему «bc», но исходный объект не изменяется.

Это частая причина ошибок, потому что, если вы не присвоили значение, вы можете получить неожиданные результаты.

Многие начинающие Java-разработчики будут использовать такие методы, как trim (), не понимая, что trim () не влияет на String.

s.trim () <- ничего не делает с s, возвращает обрезанную строку - это ошибка.

s = s.trim () <- Сохраняет обрезанную строку - это правильно.

0
ответ дан 8 December 2019 в 02:26
поделиться

Проверить:

String s = "Test";
String j = s;

s = s.substring(1);

s теперь T , а j все еще Test .

0
ответ дан 8 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: