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. С более простой строкой проще реализовать многие методы оптимизации, такие как дедупликация строк или Компактные строки.