Предскажите, что напечатает этот фрагмент с concat
Определите, что напечатает фрагмент, и объясните почему — через поведение String.
Ограничения:
- рассуждайте от неизменяемости
String— не считайте, чтоconcatменяет на месте
String a = "qwe";
a.concat("rty");
System.out.println(a);
Определите вывод и обоснуйте.
Печатает qwe. String неизменяем, поэтому concat не меняет a на месте — он возвращает совершенно новый String "qwerty". Это возвращённое значение отбрасывается, ведь оно никуда не присваивается, а a по-прежнему ссылается на исходный "qwe". Чтобы сохранить результат, нужно присвоить: a = a.concat("rty");.
- ✗Считать, что
concatменяет строку-приёмник на месте - ✗Забывать, что возвращённый новый
Stringтеряется, если не присвоен - ✗Путать семантику
Stringс изменяемымStringBuilder.append
- →Как
StringBuilder.appendповёл бы себя в этом же фрагменте? - →Какое минимальное изменение заставит его напечатать
qwerty?
Разбор
String a = "qwe";
a.concat("rty"); // создаёт новый "qwerty" и... отбрасывает его
System.out.println(a); // qwe
String в Java неизменяем: ни один метод не меняет существующий объект строки. concat создаёт и возвращает новую строку "qwerty", но ссылка a остаётся на исходный объект "qwe". Возвращённое значение нигде не сохраняется, поэтому теряется.
Чтобы получить qwerty, результат нужно присвоить:
a = a.concat("rty"); // теперь a ссылается на "qwerty"
То же касается trim, toUpperCase, replace и других — все они возвращают новую строку, а не меняют исходную.