ArrayList和LinkedList的本质区别和使用效率

相同点:

都实现了List接口,具有一系列相同的操作方法。
都可以转化为数组。

不同点:

ArrayList本质上是一个数组(Object[]),LinkedList本质上是一个双向链表(Node())。
增加的时候,ArrayList本质上是重新创建一个更长的数组,然后赋值。LinkedList是添加一个Node对象,速度上LinkedList更快。
删除的时候,ArrayList是把删除的数据后面的所有数据都向前挪动,LinkedList是把需要删除的数据关联的两个数据的Node关联参          数修改掉。ArrayListy效率要比Linkedlist快。
修改数据(set)和查询数据(get)的时候,ArrayList要优于LinkedList,因为LinkedList要移动指针。

 

单链表与双链表的区别

单链表与双链表的结构图如下:

ArrayList和LinkedList的本质区别和使用效率

ArrayList和LinkedList的本质区别和使用效率

从以上结构可以得出双链表具有以下优点:

1、删除单链表中的某个结点时,一定要得到待删除结点的前驱,得到该前驱有两种方法,第一种方法是在定位待删除结点的同时一路保存当前结点的前驱。第二种方法是在定位到待删除结点之后,重新从单链表表头开始来定位前驱。尽管通常会采用方法一。但其实这两种方法的效率是一样的,指针的总的移动操作都会有2*i次。而如果用双向链表,则不需要定位前驱结点。因此指针总的移动操作为i次。

2、查找时也一样,我们可以借用二分法的思路,从head(首节点)向后查找操作和last(尾节点)向前查找操作同步进行,这样双链表的效率可以提高一倍。

可是为什么市场上单链表的使用多余双链表呢?

从存储结构来看,每个双链表的节点要比单链表的节点多一个指针,而长度为n就需要 n*length(这个指针的length在32位系统中是4字节,在64位系统中是8个字节) 的空间,这在一些追求时间效率不高应用下并不适应,因为它占用空间大于单链表所占用的空间;这时设计者就会采用以时间换空间的做法,这时一种工程总体上的衡量。