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