Все что было не со мной - помню.
Java до 7 версии. Операции со String и память.
В версии Java начиная с 7 эта проблема решена.
Поскольку, как я вижу, тут народ интересуется Java и даже пишет на ней ботов, хочу написать небольшую заметку на тему операций со строковым типом и особенностями распределения памяти при этом. Может кому пригодится из изучающих, это не самая очевидная особенность. Она не видна глазом и в дебаге.
Вот внизу часть кода, который работает с данными типа String. Обратим внимание на 1 и 2. Они указывают на метод String.split()
Что есть плохого в методе split()? Ничего, если у вас килотонны памяти или же вы хотите один раз разбить строку "Hello Golos" на два слова по пробелу. Но если вы сначала разбиваете огромную строку (например, список файлов в огромной папке) на отдельные строки, например их 5000 выйдет , а потом разбиваете эти подстроки (5000 штук) еще на подстроки, например, по 5 штук, то это уже напоминает проблему. И вот почему.
String.subString() возвращает копию исходной строки, передвигая указатели на заданный символ, физически не удаляя остальное.
String.split() использует substring и в результате помещает в массив. То есть в примере выше исходная огромная строка будет 5000 раз скопирована и помещена в массив, а потом каждая из 5000 будет скопирована еще 5 раз.
Итого мы имеем до момента запуска сборщика мусора огромный кусок памяти забитый экземплярами нашей исходной строки.
Отредактировал, вставил читаемую картинку.