Единственное место, где вам может понадобиться new String(String)
- принудительно скопировать подстроку в новый массив символов, как в
small=new String(huge.substring(10,20))
Однако это поведение, к сожалению, не документировано и зависит от реализации.
Я был сожжен этим, когда читал большие файлы (некоторые размером до 20 МБ) в строку и разбивал ее на строки по факту. Я закончил со всеми строками для строк, ссылающихся на символ [], состоящий из всего файла. К сожалению, это непреднамеренно сохранило ссылку на весь массив для нескольких строк, которые я держал в течение более длительного времени, чем обработка файла - я был вынужден использовать new String()
, чтобы обойти его.
Единственный способ сделать это независимым от реализации:
small=new String(huge.substring(10,20).toCharArray());
К сожалению, это должно копировать массив дважды, один раз для toCharArray()
и один раз в конструкторе String.
Должен существовать документированный способ получения новой строки путем копирования символов существующей; или документация String(String)
должна быть улучшена, чтобы сделать ее более явной (в ней есть смысл, но она довольно расплывчата и открыта для интерпретации).
Подводный камень предположения о том, что не указано в документе
В ответ на комментарии, которые продолжают поступать, понаблюдайте за реализацией Apache Harmony new String()
:
public String(String string) {
value = string.value;
offset = string.offset;
count = string.count;
}
Правильно, там нет копии базового массива. И все же, он по-прежнему соответствует документации (Java 7) String в том смысле, что он:
Инициализирует вновь созданный объект String так, чтобы он представлял ту же последовательность символов, что и аргумент; другими словами, вновь созданная строка является копией строки аргумента. Если не требуется явная копия оригинала, использование этого конструктора не требуется, поскольку строки являются неизменяемыми.
Заметной частью является «копия аргумента string »; в нем не говорится «копия строки аргумента и базовый массив символов, поддерживающий строку».
Будьте внимательны при программировании документации , а не one реализация .