1、ArrayList底层是数组实现,LinkedList底层是双向链表实现
2、(1)ArrayList查询快,插入删除慢,因为数组的原因,查询通过index就能得到需要的数据,所以时间复杂度是O(1)。
插入操作分为两种情况:1)、在数组末尾插入:首先需要判断数组是否已满,没满的话直接在末尾赋值。满了的话需要进行扩容操作:新建一个容量更大的数组,使用Arrays.copyOf方法将原数组内容复制到新数组里,然后在数组末尾添加数据。2)、在指定位置插入数据:首先需要判断数组是否已满,没满的话使用System.arraycopy方法将原数组和目标数据复制给自己。满的话同1),进行扩容再复制。
删除操作也分两种情况:1)、直接在末尾删除。2)、指定位置进行删除:使用System.arraycopy方法将结果数组复制给自己
综上,ArrayList无论是时间上还是空间上插入删除效率都慢。
(2)LinkedList查询慢,插入删除快。因为双向链表的原因,每次查询都需要从头开始进行遍历,所以每次查询的时间复杂度都是O(n)。插入删除也需要遍历到需要的插入删除的位置,然后对相应节点进行操作即可,不需要对额外的数据进行操作,所以插入删除速度快。而且由于双向链表,所以每次遍历的时间是O(n/2),速度会更快