ArrayList和LinkedList对比

~、结构

ArrayList位数组结构,LinkedList为双向链表结构。

~、空间

ArrayList有固定容量,超出容量后需要扩容,在数组尾部可能保存有占位的null元素

LinkedList无固定容量,但每个元素都放在节点中,每个节点都有2个额外的定位指针(prev 和 next),第一个和最后一个节点的prev和next都指向null

~、方法及效率对比

—:add

1、add()

ArrayList在数组的最后追加,额外操作仅仅是数组满了的扩容

LinkedList在链表的最后追加同addLast(),每次创建一个新节点(新节点的prev指针指向之前的最后一个节点last),last的next指针指向新节点。每次都需给2个指针赋值。效率不如ArrayList

2、add(int index, E element)

ArrayList在数组的指定index位置添加元素element,每次都需调用System.arraycopy() 拷贝数组

LinkedList只是创建一个prev指针指向index前一个元素,next指针指向index元素的节点,并将index前节点的next指针和index节点的prev指针指向新节点。与前面的在最后添加差不多,此时效率要远远高于ArrayList

3、在结构最前面添加,ArrayList只能用 add(0, e)。而LinkedList除add(0, e)外还可以用addFirst(e)。同样LinkedList效率高于ArrayList

—:get

1、get(int index)

ArrayList直接取数组下标得到元素值

LinkedList需要遍历链表取到index位置的节点,再得到节点的item值。效率受链表长度和index在链表位置的影响

2、get遍历

for遍历

ArrayList数组长度及循环次数,一个元素只循环一次。LinkedList每取一个数都重新遍历链表,一个元素最多遍历 链表长/2次。

foreach遍历

先将集合转Iterator,循环次数都为元素的个数。

ArrayList2种方式都可,LinkedList要求使用foreach

—:remove

1、remove(int index)

ArrayList删除指定下标的元素,需调用System.arraycopy()函数,再将最后一个元素赋null

LinkedList删除指定下标的节点,改变index节点的prev节点的next为index的next,index的next节点的prev为index的prev,再清理index节点的item为null。效率也比ArrayList好。

2、remove(Object o)

删除数组或链表中第一次出现的与o相等的元素,先查找再删除,删除步骤同第一点。

3、remeve(),removeFirst(),removeLast()

3个方法都只是LinkedList所有。removeFirst()和remove()方法删除第一个节点。removeLast()删除最后一个节点。

—:set

1、set(int index, E element)

替换index位置的元素为element。

ArrayList直接取数组下标赋值。

LinkedList首先遍历链表取到index位置的节点,再将节点的item赋值。如果链表比较大切index在链表中间位置会很浪费时间。

你可能感兴趣的:(ArrayList和LinkedList对比)