Строковые объекты неизменяемы. Однако ссылки на строки являются изменяемыми. Выше s
- ссылка.
Строковые объекты неизменяемы, что означает, что значение экземпляра , на которое ссылаются s
, не может измениться.
Ваш код не изменяет экземпляр.
Вместо этого он изменяет ссылку s
для ссылки на новый экземпляр строки.
Например:
String a = "1";
String b = a;
a = "2";
После выполнения этого кода b
по-прежнему «1»
.
Строка b = a
устанавливает b
для ссылки на тот же «1»
экземпляр, к которому в настоящее время относится a
.
Когда вы впоследствии пишете a = "2"
, вы меняете переменную a
для ссылки на другой ( «2»
) экземпляр.
Однако исходный экземпляр «1»
, к которому все еще относится b
, не изменился.
Да, 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», выводимая строка будет «привет!»
Здесь вы создаете новую строку и назначаете ее ранее использованной ссылке. Исходная строка, о которой идет речь, является сборщиком мусора. Фактически никакие струны не изменились.
Итак:
String foo = "foo";
foo.substring(1);
System.out.println(foo);
//of course..
foo = "aa";
System.out.println(foo);
Когда вы используете String s = "abc", вы создаете ссылку String на объект String, который имеет неизменяемое значение "abc".
Затем, когда вы говорите s = s.substring (1);, вы назначаете s вновь созданному объекту String, содержащему «bc», но исходный объект не изменяется.
Это частая причина ошибок, потому что, если вы не присвоили значение, вы можете получить неожиданные результаты.
Многие начинающие Java-разработчики будут использовать такие методы, как trim (), не понимая, что trim () не влияет на String.
s.trim () <- ничего не делает с s, возвращает обрезанную строку - это ошибка.
s = s.trim () <- Сохраняет обрезанную строку - это правильно.
Проверить:
String s = "Test";
String j = s;
s = s.substring(1);
s
теперь T
, а j
все еще Test
.