Пожалуйста, взгляните на следующий фрагмент кода:
public static void main(String[] args) {
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(
"myfile.txt"));
String line = reader.readLine();
while (line != null) {
System.out.println(line);
// read next line
line = reader.readLine();
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Как видите, каждая строка файла читается и сохраняется в переменной 'line'. Поскольку строка имеет тип string, ее содержимое хранится в пуле строк. Строки, хранящиеся в пуле строк, не собираются сборщиком мусора Java и остаются там на протяжении всего времени существования программы.
Если файл очень большой, пул строк может раздуться. У вас есть идеи, как читать файл без сохранения всех его строк в пуле строк? Я просто должен был хранить строки файла как любой объект, что означает, что он будет удален из кучи, когда он не нужен.
1 ответ
Только строковые литералы сохраняются в SpringPool по умолчанию до тех пор, пока вы не вызовете метод .interm() объекта String.
В приведенном выше примере переменная 'line' является строковым объектом и не является частью StringPool. Вы использовали строковый литерал "myfile.txt", который будет частью StringPool
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
String
(s) вы явноintern()
. OP должениспользоватьtry-with-resources
(но этот явныйreader.close()
просто беспокоит меня).intern
.intern()
не предотвращал сборку мусора, поэтому добавление в него временных строк только замедляло работу кода.