JAVA基礎:ArrayList和LinkedList區別


  • 1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。 
  • 2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指針。 
  • 3.對於在指定index位置新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。 
  • 4.ArrayList中的操作不是線程安全的!所以,建議在單線程中才使用ArrayList,而在多線程中可以選擇Vector或者CopyOnWriteArrayList。LinkedList線程安全的處理方法

    方法一:List<String> list = Collections.synchronizedList(new LinkedList<String>());
    方法二:將LinkedList全部換成ConcurrentLinkedQueue

  • 為什么在創建ArrayList對象時要初始化默認容量?

   其實就是為了避免擴容,ArrayList擴容方法,這里 ensureCapacityInternal  才是ArrayList內部調用的擴容方法

/**
* 公有方法
*/
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
// any size if not default element table
? 0
// larger than default for default empty table. It's already
// supposed to be at default size.
: DEFAULT_CAPACITY;

if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}

private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}

ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}


擴容的大小為原容量的1.5倍+1(其實是>>1),該方法下有會改變
modCount的值
modCount變量用於在遍歷集合(iterator())時,檢測是否發生了add、remove操作。

boolean add(E e) ;//在尾部加入元素
void add(int index, E element) ;//在指定位置加入元素

因為調用arraycopy,所以效率低。(但是也沒低到哪去 執行100次 每次插入1百萬條,查了0.016s)

System.arraycopy(elementData, index, elementData, index + 1,size - index);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM