ArrayList 与 LinkedList区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
LinkedList:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
transient int size = 0;
transient Node<E> first;
transient Node<E> last;
......
}
ArrayList :
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final long serialVersionUID = 8683452581122892189L;
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
......
}
2.随机访问get函数和set函数,ArrayList会优于LinkedList.
因为ArrayList基于数组实现,可以根据下标随机定位.而LinkedList是基于链表,要移动指针一步一步的移动到要访问的节点处。
ArrayList:
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
3.于新增和删除操作add和remove,LinedList比较占优势,只需要对指针进行修改即可,而ArrayList要移动数据来填补被删除的对象的空间。
ArrayList:
public void add(int index,E element){
if(index>size||index<0)
throw new IndexOutOfBoundsException(
"Index:"+index+",size: "+size);
ensureCapacity(size+1);
System.arraycopy(elementData,index,elementData,index+1,size-index);
elementData[index] = element;
size++;
}
我们会发现,ArrayList要添加的数据下标越靠前,所要移动的数据则越多。
LinkedList
public void add(int index,E element){
addBefore(element,(index==size?header:entry(index)));
}
而对于LinkedList来说,在List的尾端插入数据与在任意位置插入数据是一样的,不会因为插入的位置靠前而导致插入的方法性能降低。