java中ArrayList和LinkedList的區別

首先來看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的開銷更大,由於除了有查找的時間複雜度外,還有增刪的移動過程。

  

  • 使用LinkedeList<Integer>實現對鏈表的排序(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;
    }
複製代碼
  • 使用LinkedeList實現棧和隊列  

 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循環。

相關文章
相關標籤/搜索