Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
---Set elements at end ( 3kk )
LinkedList: 40 ms
ArrayList: 267 ms
ArrayList is faster
Add elements ( 6kk )
ArrayList is faster
Insert elements to end( 1kk )
LinkedList is faster
LinkedList<Integer> linkedList = new LinkedList<Integer>();
ArrayList<Integer> arrayList = new ArrayList<Integer>();
int value = 123456;
System.out.println("---Add elements ( 6kk )");
Date startAddLinkedTime = new Date();
for(int i = 0; i < 6000000; i++) {
linkedList.add(value);
}
Date finishAddLinkedTime = new Date();
long addLinkedTime = finishAddLinkedTime.getTime() - startAddLinkedTime.getTime();
Date startAddArrayTime = new Date();
for(int i = 0; i < 6000000; i++) {
arrayList.add(value);
}
Date finishAddArrayTime = new Date();
long addArrayTime = finishAddArrayTime.getTime() - startAddArrayTime.getTime(); LinkedList<Integer> linkedList = new LinkedList<Integer>();
linkedList.add(0);
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(0);
int value = 123456;
System.out.println("---Insert elements to end( 1kk )");
Date startLinked = new Date();
for(int i = 0; i < 1000000; i++) {
linkedList.add(linkedList.size()-1, value);
}
Date finishLinked = new Date();
long linkedTime = finishLinked.getTime() - startLinked.getTime();
Date startArray = new Date();
for(int i = 0; i < 1000000; i++) {
arrayList.add(arrayList.size()-1, value);
}
Date finishArray = new Date();.add(list.size() - 1, value) вставляет элемент предпоследним. В ArrayList это вызывает копирование всего массива:// from java.util.ArrayList
public void add(int index, E e) {
checkBoundInclusive(index);
modCount++;
if (size == data.length)
ensureCapacity(size + 1);
if (index != size)
System.arraycopy(data, index, data, index + 1, size - index);
data[index] = e;
size++;
}
private void checkBoundInclusive(int index) {
if (index > size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
for (...) {
N = 1024*1024*1024;
ArrayList<int> arr = new ArrayList<int>(N);
arr.add(0);
}
arr в памяти увеличиться в полтора раза! LinkedList был бы чуточку экономнее. grow() в hg.openjdk.java.net/jdk7/jdk7/jdk/file/00cd9dc3c2b5/src/share/classes/java/util/ArrayList.java/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
Date startLinked = new Date();
for(int i = 0; i < k; i++) {
linkedList.get(i);
}
Date finishLinked = new Date();
long linkedTime = finishLinked.getTime() - startLinked.getTime();
Date startArray = new Date();
for(int i = 0; i < k; i++) {
arrayList.get(i);
}
---Get elements line ( 100k )
LinkedList: 11096 ms
ArrayList: 0 ms
public E More ...get(int index) {
return entry(index).element;
}
private Entry<E> More ...entry(int index) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
Entry<E> e = header;
if (index < (size >> 1)) { // из-за этого условия работать с концом списка в режиме произвольного доступа можно так же быстро, как и с началом.
for (int i = 0; i <= index; i++)
e = e.next;
} else {
for (int i = size; i > index; i--)
e = e.previous;
}
return e;
}
Когда использовать LinkedList:
1. Необходимо много данных добавлять в начало списка
2. Удалять с начала (index = 0) списка, т.е. элементы, которые были добавлены первыми.
3. .set в конце списка
ArrayList: 23 ms
Сравнение скорости работы ArrayList и LinkedList на практике