ArrayList和LinkedList的算法实现和区别

来源:互联网 发布:网络建设与管理方案 编辑:程序博客网 时间:2024/05/20 02:21

ArrayList采用的是动态数组的数据结构,动态数组的数据结构原理如下所示:


  这就是一个最基本的动态数组,pData记录了数组第一个元素的位置,Unit Size记录了每个元素的大小,(这样可以方便地找到第N个元素了)Unit Number记录了元素的数目。
  获取数组中第N个元素,是很简单的,无需多说。
  但已知某位置,要插入一个元素,就稍微有点难,因为要挪动一些元素,如图:


  删除元素跟这个也类似,也是需要挪一挪后面的元素,只不过是往前挪。


  数组的大小不能很方便地调整,需要几个步骤,如下图所示:

LinkedList采用的是链表的数据结构,算法实现如下所示

下图就是最简单最一般的单向链表:


  还有这种:


  多一个Tail指针,好处就是能很方便地找到末尾,然后在末尾插入新的元素什么的。还有这种也比较常见:


  留一个终始标志,这个节点作为一个标志,不用于存储数据,链表末尾指向这个节点,形成一个“环形链表”,这样无论在链表的哪里插入新的元素,操作都一致了,不必判断头和尾的特殊性。
  数组的好处就是链表的坏处,数组的坏处就是链表的好处,请看:


   因为需要从头开始找,没办法像数组那样直接跳到那个地址。而插入元素,就比数组方便了,如果你已经得知了要插入的地址的话,不过还要注意哦,是“后插入”(Insert After):


  有“后插入”,那就有“前插入”(Insert Before),两者对单向链表来说真的不一样,下图描述了“前插入”:


  由于指针向后不向前,我们不知道要插入位置的前一个节点是什么,只能从头找,所以比较麻烦。至于链表大小的重新调整,和数组相比如何呢?呃……我可没说链表有大小限制吧?
  

总结:

综上的实现原理可以知道:

1、对于一般常用的get、set方法使用ArrayList的性能要明显优于LinkedList,因为LinkedList的。

2、对于插入和删除数据LinkedList要明显优于ArrayList,因为ArrayList要移动出入之后的所有数据的位置。

3、在扩容方面ArrayList的性能也要明显低于LinkedList


1 0