Я знаю, что строка 2 по-прежнему будет указывать на «Понедельник» и будет иметь новый объект String со смещением и счетчиком, установленными на 0,3.
Это в настоящее время верно для реализации Sun JRE. Кажется, я вспоминаю, что это не относится к реализации Sun в прошлом и не относится к другим реализациям JVM. Не полагайтесь на поведение, которое не указано. GNU classpath может скопировать массив (я не могу вспомнить, какое соотношение используется, чтобы решить, когда копировать, но он копирует, если копия является достаточно маленькой частью оригинала, что превратило один хороший алгоритм O (N) в O (N ^ 2)).
Строка 4 создаст новую строку "Mon" в пуле строк и укажет на нее.
Нет, он создает новый строковый объект в куче, подчиняясь тем же правилам сборки мусора, что и любой другой объект. Совместно ли он использует один и тот же базовый массив символов, зависит от реализации. Не полагайтесь на поведение, которое не указано.
Конструктор String(String)
говорит:
Инициализирует вновь созданный объект String таким образом, чтобы он представлял ту же последовательность символов , что и аргумент; другими словами, вновь созданная строка является копией строки аргумента.
Конструктор String(char[])
сообщает:
Выделяет новую строку, чтобы она представляла последовательность символов, в настоящее время содержащуюся в аргументе массива символов. содержимое массива символов скопировано; последующая модификация массива символов не влияет на вновь созданную строку.
Следуя хорошим принципам ОО, ни один метод String
на самом деле не требует, чтобы он был реализован с использованием массива символов, поэтому ни одна часть спецификации String
не требует операций с массивом символов. Те операции, которые принимают массив в качестве входных данных, указывают, что содержимое массива копируется в любое внутреннее хранилище, используемое в строке. Строка может использовать сжатие UTF-8 или LZ внутри и соответствовать API.
Однако, если ваша JVM не выполняет оптимизацию подстроки с малым отношением, тогда есть вероятность, что она скопирует только соответствующую часть, когда вы используете new String(String)
, так что это случай, если вы попробуете это улучшает использование памяти. Не все, что влияет на время выполнения Java, определяется Java.
Чтобы получить строку в пуле строк, равную equal
строке, используйте метод intern()
. Это либо извлечет строку из пула, если она уже была интернирована, либо создаст новую строку и поместит ее в пул. Обратите внимание, что объединенные строки имеют другое (опять-таки зависящее от реализации) поведение сборки мусора.