Die ArrayList verwaltet alles, was Du reinsteckst, als
Object.
Das heißt zum einen, dass wenn Du einen Valuetype (also z.B. Integer) reinsteckst, es zu
boxing bzw. unboxing (letzteres beim Abrufen) kommt. Das ist performancemäßig nicht gut.
Zum anderen heißt es, dass Du die Typinformation verlierst. Du könntest in der ArrayList ja sogar Elemente verschiedenen Typs haben! Das führt am Ende nur zu Fehlern, vor allem aber auch zu unschönem Code, weil Du immer erst casten musst.
Bei einer
List<T> sparst Du Dir nicht nur das casten, sondern da sie die Typinformation enthält, hast Du alle Annehmlickeiten des IntelliSense oder auch
type inference.
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".