Я следил за предыдущим сообщением об этом:
Для LinkedList
- get is O (n)
- add is O (1)
- remove - O (n)
- Iterator.remove - O (1)
Для ArrayList
- get is O (1)
- add - O (1) амортизируется, но O (n) наихудший, так как массив должен быть изменен и скопирован
- remove - O (n)
Итак, посмотрев на это, я пришел к выводу, что если мне нужно сделать только последовательную вставку в моей коллекции за 5000000 элементов, LinkedList
будет outclass ArrayList
.
И если мне нужно просто извлечь элементы из коллекции, итерации, т.е. не захватив элемент посередине, все равно LinkedList
будет превзойти `ArrayList.
Теперь, чтобы проверить мои предыдущие два утверждения, я написал ниже пример программы... Но я удивлен, что мои предыдущие утверждения оказались неверными.
ArrayList
outclassed LinkedList
в обоих случаях. Для добавления, а также получения их из коллекции потребовалось меньше времени LinkedList
. Есть ли что-то, что я делаю неправильно, или исходные утверждения о LinkedList
и ArrayList
недействительны для коллекций размером 5000000?
Я упомянул размер, потому что, если я уменьшу количество элементов до 50000, LinkedList
будет работать лучше, и исходные операторы верны.
long nano1 = System.nanoTime();
List<Integer> arr = new ArrayList();
for(int i = 0; i < 5000000; ++i) {
arr.add(i);
}
System.out.println( (System.nanoTime() - nano1) );
for(int j : arr) {
;
}
System.out.println( (System.nanoTime() - nano1) );
long nano2 = System.nanoTime();
List<Integer> arrL = new LinkedList();
for(int i = 0; i < 5000000; ++i) {
arrL.add(i);
}
System.out.println( (System.nanoTime() - nano2) );
for(int j : arrL) {
;
}
System.out.println( (System.nanoTime() - nano2) );