На самом деле я начал думать, что следует избегать любого использования структур данных с недетерминированным поведением, таких как ArrayList или HashMap, поэтому я бы сказал, что используйте ArrayList, только если вы можете ограничить его размер; любой неограниченный список использует LinkedList. Это потому, что я в основном кодирую системы с требованиями, близкими к реальному времени.
Основная проблема заключается в том, что любое выделение памяти (которое может произойти случайно с любой операцией добавления) также может привести к сборке мусора, а любая сборка мусора может привести к тому, что вы пропустите цель. Чем больше выделение, тем больше вероятность того, что это произойдет, и это также усложняется, если вы используете коллектор CMS. CMS не компактирует, поэтому поиск пространства для нового узла связанного списка обычно будет проще, чем поиск пространства для нового массива из 10 000 элементов.
Чем тщательнее вы подходите к кодированию, тем ближе вы сможете приблизиться к реальному времени с помощью стандартной JVM. Но выбор только структур данных с детерминированным поведением - один из первых шагов, которые вам нужно сделать.