Я думаю, что если это правильно, ваш подход не должен использовать слишком много дополнительной памяти.Возможно, вы могли бы сэкономить память, убедившись, что вы инициализируете ArrayList с тем, сколько элементов вы собираетесь добавить.Это может или не может работать для вашего алгоритма.
Возможно, вам придется создать новый ArrayList после определения всех значений, а затем скопировать в него свои результаты.Это уменьшит избыточную емкость, выделенную списком.Когда список массивов достигает своей внутренней емкости, он должен выделить больше памяти.
Это сэкономит вам только несколько байтов на ArrayList, поэтому будет стоить только, если у вас будет МНОГО записей на карте.
ArrayList vs LinkedList с точки зрения выделения памяти
Еще один аспект, который следует учитывать, - это то, сколько места занимает объект String.Кажется, вы ссылаетесь на файл и список слов.Если файл может оставаться в памяти в виде большой строки (максимальный размер ~ 2 ГБ), тогда все вызовы .substring будут просто «окнами» в этот файл.Если вы создаете новые объекты String, это будет более требовательным к памяти.
Почему добавление "" в String сохраняет память?