Другие предложили прочитать и обработать части вашего файла за один раз. Если возможно, один из этих способов будет лучше.
Однако, если это невозможно, и вы можете изначально загрузить String
в память, как вы укажете, но более поздний анализ этой строки создает проблемы, вы можете использовать подстроки. В Java подстрока отображается поверх исходного массива char
и просто занимает память для базового Object
, а затем для указателей на начало и длину int.
Итак, когда вы найдете часть строки, которую хотите сохранить отдельно, используйте что-то вроде:
String piece = largeString.substring(foundStart, foundEnd);
Если вы вместо этого или кода, который внутренне это делает, то использование памяти резко возрастет:
new String(largeString.substring(foundStart, foundEnd));
Обратите внимание, что именно по этой причине вы должны использовать String.substring()
с осторожностью. У вас может быть очень большая строка, из которой вы берете подстроку и затем отбрасываете свою ссылку на исходную строку. Проблема в том, что подстрока все еще ссылается на исходный большой массив char
. GC не освободит это, пока подстрока также не удалена. В подобных случаях полезно на самом деле использовать new String(...)
, чтобы гарантировать, что неиспользуемый большой массив будет отброшен GC (это один из немногих случаев, когда вам следует использовать new String(...)
).
Другой метод, если вы ожидаете, что вокруг будет много маленьких строк и, вероятно, они будут иметь одинаковые значения, но исходят из внешнего источника (например, файла), - это использовать .intern()
после создания новой строки.
Примечание: это зависит от реализации String
, о которой вам действительно не нужно знать, но на практике для больших приложений иногда приходится полагаться на эти знания. Имейте в виду, что будущие версии Java могут изменить это (хотя маловероятно).