As I understand it, the benefit of a LinkedList is on insertion of a value into a given index (say, the middle, or the start). ArrayList won't lose out on sequential insertion, as it doesn't have to shift elements over.
Once you have populated your lists as above, see what you get for in-position insertion to different places. I've modified your example to show an example of where LinkedList wins significantly (on my setup at least):
public static void main(String[] args) {
int number = 5000000;
LinkedList<Integer> llist = new LinkedList<Integer>();
ArrayList<Integer> alist = new ArrayList<Integer>();
long startTime1 = System.nanoTime();
fillLinkedList(number, llist);
long stopTime1 = System.nanoTime();
long startTime2 = System.nanoTime();
fillArrayList(number, alist);
long stopTime2 = System.nanoTime();
System.out.println(" LinkedList needed: "+ (stopTime1 - startTime1));
System.out.println(" ArrayList needed: "+ (stopTime2 - startTime2));
startTime1 = System.nanoTime();
llist.add(1, 4);
stopTime1 = System.nanoTime();
startTime2 = System.nanoTime();
alist.add(1, 4);
stopTime2 = System.nanoTime();
System.out.println(" LinkedList needed: "+ (stopTime1 - startTime1));
System.out.println(" ArrayList needed: "+ (stopTime2 - startTime2));
}
public static void fillLinkedList(int number, LinkedList<Integer> list){
ListIterator<Integer> it = list.listIterator();
int i = 0;
while(i++<number){
it.add(i);
}
// System.out.println("LinkedList size: "+list.size());
}
public static void fillArrayList(int number, ArrayList<Integer> list){
ListIterator<Integer> it = list.listIterator();
int i = 0;
while(i++<number){
it.add(i);
}
// System.out.println("ArrayList size: "+list.size());
}