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 раз.
Итого мы имеем до момента запуска сборщика мусора огромный кусок памяти забитый экземплярами нашей исходной строки.
Отредактировал, вставил читаемую картинку.
Хороший пост на хабре Изменения в String. Java 7. Я думаю там автор достаточно подробно раскрыл эту тему. Вы лучше расскажите о java 8-9. Java 6-7 это круто но но уже почти устарело.
я сам разберусь что мне лучше. но спасибо за заботу.
На хабре есть хороший пост про сплит.
Пост хороший но не много устарел, уже есть 9 java а вы нам про 6 и 7 рассказываете =) Расскажите про что то новое я буду вам благодарен)
я не обязан вам ничего рассказывать. гуглите и обрящете
я же не требую, я написал что буду благодарен =) А в целом у тебя хорошие посты ) Я же их апаю
чтобы апать - читать не обязательно ))))))
можно и так =) но я люблю читать из мира javвы )
@antabis Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@antabis Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за Количество комментариев
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп