Код, который вы публикуете, выделит новый экземпляр ArrayList. Если вы хотите использовать один и тот же, вы можете сделать это:
ArrayList<String> al = new ArrayList<String>();
...add values, work with it and so on....
al.clear();
// now you can use a1
Но делайте это с осторожностью - если вы передадите начальный экземпляр a1
другому коду, который будет использовать его в течение более длительного периода, то его очистка вызовет проблемы, и вам потребуется отдельный экземпляр.
Но также обратите внимание, что экономия, которую вы получаете от переработки массивов объектов и списков массивов, не так уж велика. Если в ArrayList вы храните строки размером 10 x 4096 байт, сам список массивов занимает только пространство, пропорциональное размеру ссылок, например, около 4 байтов х 10 = 40 байтов. Это упрощение, но принцип верен. Таким образом, даже если вы повторно используете тот же список массивов, вы экономите только память, используемую для хранения ссылок на объекты, а не сами объекты. Имея это в виду и риск возникновения ошибок из-за непреднамеренного изменения коллекции, я бы предположил, что большинство людей не беспокоятся об утилизации списков.
Управление памятью в современной виртуальной машине действительно очень хорошо, и вам следует начинать «оптимизацию» памяти только тогда, когда вы видите, что в этом есть необходимость. Фактически, использование объектов дольше, чем их естественное время жизни, может отрицательно повлиять на производительность сборки мусора.
Мой совет: сначала четко кодируйте, профилируйте и сосредоточьтесь на оптимизации использования памяти только тогда, когда вы видите, что есть проблема и определили причину.
Удачи!