Java集合框架_Arraylist和linkedlist异同

1、是否保证线程安全:ArrayList和linkedlist都是不同步的,也就是不保证线程安全

2、底层数据结构:ArrayList底层使用的是Object数组,LinkedList底层使用的是双向链表数据结构

3、插入和删除是否受元素位置影响:

Arraylist采用数组存储,所以插入和删除元素的时间复杂度受元素的位置影响,如果是插入一个元素,默认位置是追加到列表的末尾,这种情况的时间复杂度是O(1)。如果在指定的位置插入i和删除元素的话,则时间复杂度就是O(n-i)。因为在进行上述操作的时候需要进行移位。

LinkedList采用链表储存,所以插入,删除的时间复杂度不受元素位置的影响,都说O(1)。

4、是否支持快速随机访问:LinkedList不支持高效的随机元素访问,而ArrayList支持。快速随机访问就是通过元素的序号快速获取元素对象,对应于get(int index)方法

5、内存空间的占用:ArrayList的空间浪费主要体现在list列表的结尾会预留一定的空间容量,而Linkedlist的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间,因为套存放直接后继和直接前驱以及数据

补充内容:RandomAccess接口

查看源码会发现实际上这个接口中什么都没有定义。所以它只是作为一个标识的功能,标识实现这个接口的类具有随机访问的功能。

在binarySearch方法中需要判断传入的list是否有RandomAccess的实例,如果是,调用indexBinarySearch方法如果不是调用iteratorBinarySearch方法

public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key);
else
return Collections.iteratorBinarySearch(list, key);
}

 

ArrayList实现了RandomAccess接口,而linkedlist没有实现,为什么呢?因为ArrayList底层是数组,而LinkedList底层是链表。

数组天然支持随机访问,时间复杂度是O(1),所以称为快速随机访问。链表遍历到特定的位置才能访问特定位置的元素,时间复杂度是O(n),所以不支持快速随机访问。

下面再总结一下list遍历的方式选择

1、实现了RandomAccess接口的list优先选择普通的for循环遍历,其次是foreach

2、未实现RandomAccess接口的list,优先选择iterator遍历,大size的数据千万不要使用普通的for循环

 

posted @ 2019-08-05 18:39  chyblogs  阅读(270)  评论(0)    收藏  举报