Объект типа String все таки изменяемый?

95
02 ноября 2021, 03:00

В учебнике Герберта Шилдта "Java Полное руководство", написано, что созданный объект типа String неизменяем, а именно "после того, как объект типа String будет создан, изменить символы, составляющие новую строку, уже нельзя".

Вот этот код добавит символ в конец строки:

String str = "world wide";
str += 'x';

Как я понимаю, выходит, что объект типа String изменяемый, но с определенными ограничениями, такими как, например: нельзя заменить символ в середине, нельзя добавить символ в середину и т.п. Правильно имеются какие либо ещё неточности в формулировках в учебниках?

Answer 1

В примере, который вы показали - это не изменение объекта. В этот момент str += 'x'; вы создаёте новую строку и пишете её в переменную str, но на изначальный str со значением "world wide" ссылка была утеряна.

Безопасность и String pool основные причины неизменяемости String в Java.
Безопасность объекта неизменяемого класса String обусловлена такими фактами:
    1) Вы можете передавать строку между потоками и не беспокоиться что она будет изменена
    2) Нет проблем с синхронизацией (не нужно синхронизировать операции со String)
    3) Отсутствие утечек памяти
    4) В Java строки используются для передачи параметров для авторизации, открытия файлов и т.д. - неизменяемость позволяет избежать проблем с доступом
    5) Возможность кэшировать hash code
String pool позволяет экономить память и не создавать новые объекты для каждой повторяющийся строки. В случае с изменяемыми строками - изменение одной приводило бы к изменению всех строк одинакового содержания.

Если нужно изменять, есть StringBuffer.

READ ALSO
Wake-on-LAN приложение для Android

Wake-on-LAN приложение для Android

Пытаюсь реализовать Wake On LAN в своем приложенииВот код:

74
Возникает ошибка java.lang.NoClassDefFoundError: Failed resolution of: [Ljava/awt/geom/Line2D$Float;

Возникает ошибка java.lang.NoClassDefFoundError: Failed resolution of: [Ljava/awt/geom/Line2D$Float;

Работаю над андроид игрушкой и вылазит ошибка

129
Java Orika Mapper

Java Orika Mapper

ЗдраствуйтеУ меня есть PostEntity, PostDto и есть OrikaMapper

166
Java: вывести слова из текста в алфавитном порядке

Java: вывести слова из текста в алфавитном порядке

Есть массив со словами, как вывести слова в массиве по алфавиту и посчитать сколько одинаковых слов, например:

211