Kurz erklärt
Die gebräuchlichste List-Implementierung in Java — intern ein dynamisch wachsendes Array, das bei Bedarf automatisch vergrößert wird.
Genauer
Zugriff per Index (get(i)) ist sehr schnell (konstante Zeit), Einfügen/Entfernen in der Mitte dagegen langsam, da nachfolgende Elemente verschoben werden müssen. Im Gegensatz zu einem klassischen Array muss die Größe nicht vorher feststehen.