String.substring() создает копию базового значения char []
Вопрос, связанный с соображениями производительности для String.substring
. До Java 1.7.0_06 метод String.substring()
возвратил новый объект String
, который поделился с тем же базовым массивом char, что и его родители, но с разными смещениями и длиной. Чтобы избежать хранения очень большой строки в памяти, когда требуется только небольшая подстрока, программисты использовали для написания кода следующим образом:
s = new String(queryReturningHugeHugeString().substring(0,3));
Начиная с версии 1.7.0_06, нет необходимости создавать новый String
, потому что в реализации Oracle String
подстроки больше не разделяют свой базовый массив char.
Мой вопрос: можем ли мы полагаться на Oracle (и другие вендоры), не возвращаясь к char[]
совместному использованию в какой-то будущей версии, и просто делаем s = s.substr(...)
, или мы должны явно создавать новую строку на всякий случай релиз JRE снова начинается с реализации совместного использования?
Ответы
Ответ 1
Фактическое представление String
является внутренней деталью реализации, поэтому вы никогда не можете быть уверены. Однако, согласно публичным выступлениям инженеров Oracle (особенно @shipilev), очень маловероятно, что он будет изменен. Это было сделано не только для борьбы с возможной утечкой памяти, но и для упрощения внутренних элементов String. С более простой строкой проще реализовать многие методы оптимизации, такие как дедупликация строк или Компактные строки.