首先來看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循環。