Ignore this answer. Other answers, particularly aix, are mostly correct. In the long run, they can bet. And if you have enough data (one model on one machine, it seems, about a million records), ArrayList and LinkedList currently work as advertised. However, there are some subtleties that apply at the beginning of the XXI century.
Modern computer technology, according to my tests, gives a huge advantage to arrays. Array elements can be shifted and copied at insane speeds. As a result, arrays and ArrayList will in most practical situations outperform LinkedList in insertions and deletions, often dramatically. In other words, ArrayList will beat LinkedList in its own game.
The disadvantage of ArrayList is that it tends to hang on memory space after deletion, where LinkedList discards space when it issues records.
The larger the back of arrays and ArrayList, the more they are free from fragments and overload the garbage collector. As the ArrayList array expands, it creates new larger arrays, copies the old array to the new one, and frees the old one. The memory is filled with large adjacent pieces of free memory, which are not large enough for the next distribution. In the end, there is no suitable place for this distribution. Although 90% of the memory is free, not a single piece is large enough to do the job. The GC will work desperately to move things, but if it takes too long to rebuild the space, it will throw an OutOfMemoryException. If he does not give up, he can still slow down the program.
Worst of all, this problem is difficult to predict. Your program will work fine once. Then, with less memory, without warning, it slows down or stops.
LinkedList uses a small, graceful bit of memory and the GC loves it. It still works fine when you use 99% of the available memory.
In general, use an ArrayList for smaller datasets that are unlikely to delete most of their contents, or when you have tight control over creation and growth. (For example, creating one ArrayList that uses 90% of the memory and using it without filling it for the duration of the program is okay. Constantly creating and freeing ArrayList instances that use 10% of memory will kill you.) Otherwise, go to LinkedList (or any card if you need random access). If you have very large collections (for example, more than 100,000 items), there are no problems with the GC, as well as planning a lot of insertions and deletions and no random access, run a few benchmarks to find out which is faster.