ArrayList和LinkedList是List接口的两个不同实现,实现的思想不同,应用场景也不同。以下对ArrayList和LinkedList的特性进行了一下小结,并附了部分ArrayList和LinkedList源码。
ArrayList特性:
(1)快速随机访问
内部采用一个Object数组保存数据,所以可以随机访问每个元素而不用考虑性能问题。
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
(2)向其中添加元素速度慢
当你创建数组是并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情:
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3) / 2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
(3)操作其中对象的速度慢
当你要想数组中任意两个元素中间添加对象时,数组需要移动所有后面的对象。
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
ensureCapacity(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
LinkedList特性
(1)操作其中对象的速度快
只需要改变链接,新的节点可以在内存中的任何地方。
public E set(int index, E element) {
Entry
E oldVal = e.element;
e.element = element;
return oldVal;
}
(2)不能随机访问
虽然存在 get() 方法,但是这个方法是通过遍历接点来定位的所以速度慢。
private Entry
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException(“Index: ” + index + “, Size: ” + size);
Entry
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;
}
总结:
如果你的需求是:(1)需要频繁的随机访问容器中的数据,(2)不需要频繁的对容器中的数据进行修改或者移动,那么考虑使用ArrayList;
如果你的需要是:(1)不需要频繁的随机访问容器中的数据,(2)需要频繁的对容器中的数据进行修改或者移动,那么考虑使用LinkedList;
Sorry, the comment form is closed at this time.
No comments yet.