1. 程式人生 > >基礎篇之集合(一)(List)總結

基礎篇之集合(一)(List)總結

intern ansi [] 集合 add 引用 public log ++

1. List集合下常用的集合(ArrayList,LinkedList,Vector);

  JVM垃圾回收GC,Java中采取了可達性分析法,標記所有從根節點開始的可達對象,未被標記的對象就是未被引用,但是沒有引用的不一定會被作為垃圾清理,因為有些是可復活對象,這裏不作說明,除以上情況以外的會被作為垃圾清理,什麽時候開始清理,這個涉及到內存機制,這裏不作說明,詳情可見垃圾復制算法等。

1)LinkedList:LinkedList底部是基於鏈表,元素可重復,線程不安全,查詢慢,增刪快;

原因:

基於鏈表:源碼分析

//第一個對象的引用和最後一個對象的引用
	transient Node<E> first;
     transient Node<E> last;
//每個元素的頭(前一個對象的引用),中(自己本身的信息),尾(下一個對象的引用)
  	E item;
    	Node<E> next;
    	Node<E> prev;

元素可重復:源碼分析

     //沒有去重機制 
	public boolean add(E e) {
        linkLast(e);
        return true;
    	}
	void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
	//最後一個元素指向新加入的元素
        last = newNode;
	//l是否為null
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    } 

線程不安全: 其它線程不會暫停;

查詢慢,增刪快: 雙向鏈表,從頭或者從尾開始查詢(依據size >> 1//除2),所以慢,增刪只需要更改上面基於鏈表中的next和prev的所以快

2)ArrayList:ArrayList底部是基於數組,元素可重復,線程不安全,查詢快,增刪慢;

原因:

基於數組,源碼分析:

transient Object[] elementData

元素可重復:源碼分析

     //沒有去重機制
   public boolean add(E e) {
         ensureCapacityInternal(size + 1);
         elementData[size++] = e;
         return true;
     }

線程不安全:其它線程不會暫停;

查詢快,增刪慢: 基於數組所以查詢快,增刪慢原因如下:

System.arraycopy(elementData, index+1, elementData, index,numMoved);

  

3)Vector:Vector底部是基於數組,元素可重復,線程安全,效率低

類似於ArrayList,但在其基礎上添加了synchronized,線程安全,其它線程會暫停,所以效率低

基礎篇之集合(一)(List)總結