首先来看ArrayList和LinkedList的集成类和接口的区别。java
// lang java public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Queue<E>, Cloneable, Serializable
ArrayList实现了随机访问的接口,LinkedList实现了Quene的接口。数组
ArrayList是基于数据实现的list,而LinkedList是基于链表实现的list。因此,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性。安全
ArrayListdom
优势:适合随机读取的时候,读取速度快,能够一步get(index)。spa
缺点:添加值很慢——一方面,添加数据在array中间的时候,须要移动后面的数;另外一方面,当长度大于初始长度的时候,每添加一个数,都会须要扩容。指针
LinkedList:双向链表排序
优势:添加值很快——添加在list中间也只须要更改指针;长度不固定。接口
实现栈和队列方面,LinkedList要优于ArrayList。队列
LinkedList的remove(int)和remove(Object)的方法的时间复杂度都是O(n),不是O(1).由于会有一个查找的过程。rem
LinkedList的remove(int)要优于remove(Object),由于remove(int)在查找的时候,会从链表的中间查找,若是int比中间小,找前半部分,不然找后半部分(相似二分查找)。
ArrayList的增删比LinkedList的开销更大,由于除了有查找的时间复杂度外,还有增删的移动过程。
//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; }
Stack.java
import java.util.*; class Stack{ private LinkedList list; public Stack(){ list=new LinkedList(); } public Object top(){ //输出最上面的元素 if(list.size()!=0){ return list.getFirst(); } return -1; } public void pop(){ //出栈 if(list.size()!=0){ list.removeFirst(); } } public void push(Object v){ //入栈 list.addFirst(v); } public int getLen(){ return list.size(); } }
Test.java
import java.util.*; class Test{ public static void main(String[] args){ Stack stack = new Stack(); stack.push("张三"); stack.push(3); stack.push("李四"); stack.push("5"); System.out.println("长度---"+stack.getLen()); //4 /** //注意这样写是有问题的,由于在出栈的过程当中stack.getLen()是会发生变化的 for(int i=0;i<stack.getLen();i++){ System.out.println(stack.top()); stack.pop(); //System.out.println("长度---"+stack.getLen()); //4 } **/ /** //正确 int i=stack.getLen()-1; while(i>=0){ System.out.println(stack.top()); stack.pop(); i--; } **/ //正确,可是会引来不安全操做提醒 while(stack.getLen()>0){ System.out.println(stack.top()); stack.pop(); } System.out.println(stack.top()); stack.pop(); } }
为何while的编译时间长于for循环。