面试题经常会问到ArrayList和LinkedList的区别。通过源码更深入了解其区别。
ArrayList是数组形式存放数据的。
private transient Object[] elementData;
LinkList是链表是存放的。
private transient Entry<E> header = new Entry<E>(null, null, null);
private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;
其数据关联关系如下图:
上图有两个数据,只画了previous,next没画,画了太乱,自行理解。
ArrayList增加数据
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++;
}
其先就index位置腾出来,将值放进去。
LinkedList增加数据:
将数据加入链表中间。
ArrayList和LinkedList比较:
ArrayList增加需要移动数据,而LinkedList不需要,删除相似。
查询数据,ArrayList相当于用指针直接查询,LinkedList需要一步步往上或往下寻找。
都可以无限增加数据。
ArrayList删除数据后,占用的引用指针空间不会释放。LinkedList数据对象不再引用,可以回收。