The size, isEmpty, get, set, iterator, and listIterator operations run in constant time. - ArrayList
However, for a LinkedList, the entire list must be traversed to get to the desired index.
Most of the time, the List is being iterated, which is quicker over a primitive array than walking a LinkedList.
There is one place where an item is removed, potentially from the middle of the list here but the speed of removing from the middle of the list isn't bad; it's a system native array shift, and it only happens on the off chance that a block pool is removed from the DataNode.