Anhand der ArrayList, bzw. des Interfaces List<> ergibt sich, dass du in deinem Programm einfach eine Variable vom Typ List<> anlegen und mit deren Methoden arbeiten kannst. Welche konkrete Implementation dahinter liegt, kannst du z.B. per Dependency Injection jederzeit festlegen oder auch ändern. Allein in der Java Klassenbibliothek gibt es folgende Implementationen von List<>:
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector
Und niemand hindert dich daran eine eigene Implementation zu machen, die deine ganz speziellen Bedürfnisse abdeckt.
Dein Programm, das nur die Variable vom Typ List<> verwendet, wird nichts davon merken, was genau dahinter steckt.