首先来看ArrayList和LinkedList的集成类和接口的区别。 - public class ArrayList<E> extends AbstractList<E> implements List<E>,
- RandomAccess, Cloneable, Serializable
- public class LinkedList<E> extends AbstractSequentialList<E> implements
- List<E>, Deque<E>, Cloneable, Serializable
* c! R& T. O2 Q& S+ {8 q V3 m' |+ c1 T7 H
ArrayList实现了随机访问的接口,LinkedList实现了Deque双向队列的接口,最终继承的是Queue。 ArrayList是基于数据实现的list,而LinkedList是基于链表实现的list。所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性。 优缺点
2 s5 r( }9 c8 c ArrayList 优点:适合随机读取的时候,读取速度快,可以一步get(index)。 缺点:添加值很慢——一方面,添加数据在array中间的时候,需要移动后面的数;另一方面,当长度大于初始长度的时候,每添加一个数,都会需要扩容。 LinkedList:双向链表 优点:添加值很快——添加在list中间也只需要更改指针;长度不固定。 实现栈和队列方面,LinkedList要优于ArrayList。 其它
6 V6 ^: B$ p% A# Q5 y K LinkedList的remove(int)和remove(Object)的方法的时间复杂度都是O(n),不是O(1).因为会有一个查找的过程。 LinkedList的remove(int)要优于remove(Object),因为remove(int)在查找的时候,会从链表的中间查找,如果int比中间小,找前半部分,否则找后半部分(类似二分查找)。 ArrayList的增删比LinkedList的开销更大,因为除了有查找的时间复杂度外,还有增删的移动过程。 使用LinkedeList实现对链表的排序(sougou笔试题) - //LinkedList<Integer>实现链表的排序 使用插入排序
- public LinkedList<Integer> insertSortForLinkedList(LinkedList<Integer> list){
- int len=list.size();
- for(int i=1;i<len;i++){
- int j=i-1;
- int temp=list.get(i);
- list.remove(i); //注意这里需要删除元素
- while(j>=0&&temp<list.get(j)){
- j--;
- }
- list.add(j+1,temp);
- }
- return list;
- }! i' K) Z& c3 m- k) ]2 j. P
$ \$ i( o" S/ }4 t- z4 \ |