基礎篇之集合(一)(List)總結
阿新 • • 發佈:2017-09-04
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)總結