一、二者的共同点
ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用,他们都可以对元素的增删改查进行操作。
下图是是源码展示:
1、ArrayList源码片段:
2、LinkedList源码片段:
二、二者的不同点
1、ArrayList是实现了基于动态数组的数据结构,LinkedList是基于非循环链表结构
2、对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3、对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据
源码分析:
1、ArrayList源码片段:
从上图源码中,可以看到ArrayList是实现了动态数组的数据结构。由于数组是一段连续的、按照顺序进行存储的存储空 间,则存储数据的内存也是连续的,也因此决定了它的特点就是按址读取数据比较容易、插入和删除数据比较困难。简单来说,读取数据时,只需要告诉数组从哪个位置(也就是索引)取数据,数组就会把该索引处的数据取出来。插入和删除比较困难是因为存储数据的内存是连续的,要在某个索引处(数组中间)插入和删除就必须改变该索引之后的数据的位置,这个是比较耗时的。
2、LinkedList源码片段:
由上图,在JDK 1.7版本之后,1.6的headerEntry循环链表被替换成了firstEntry和lastEntry组成的非循环链表。在插入/删除 的时候,也是默认在链尾操作。把插入的obj当成newLast,挂在oldLast的后面。另外还要先判断first是否为空,如果为空则first =obj。