... какой использовать для предотвращения утечки памяти
Ответ: все из них и нет из них.
Утечка памяти связана не со структурой данных, а с тем, как вы их используете.
Количество используемой памяти не имеет значения, когда вы стремитесь избежать «утечки памяти».
Лучшее, что вы можете сделать: когда вы обнаружите объект больше не будет использоваться в приложении, вы должны удалить его из коллекции (не только тех, которые Вы перечислили, но любой другой, который вы могли бы использовать: список, карта, набор или даже массивы).
Таким образом сборщик мусора сможет освободить память, используемую этим объектом.
Вы можете взглянуть на эту статью "Как работает сборщик мусора" для более подробного объяснения того, как Java освобождает память от объектов, которые он использует.
Edit:
Существуют и другие структуры данных в Java, которые помогают в управлении ссылками, например WeakHashMap , но это можно рассматривать как «дополнительные темы».