- ArrayList和CopyOnWriteArrayList
- CopyOnWriteArrayList詳解
源碼:
為撫寧等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及撫寧網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站建設、成都網(wǎng)站建設、撫寧網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!// 增
public boolean add(E e) {
//進行數(shù)組容量判斷,不夠就擴容
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
public void add(int index, E element) {
//檢查是否會越界
rangeCheckForAdd(index);
//進行數(shù)組容量判斷,不夠就擴容
ensureCapacityInternal(size + 1); // Increments modCount!!
//將index至數(shù)據(jù)最后一個元素整體往后移動一格,然后插入新的元素
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
// 刪
public E remove(int index) {
//判斷是否越界
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
//若該元素不是最后一個元素的話,將index+1至數(shù)組最后一個元素整體向前移動一格
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
// 改
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
// 查
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
E elementData(int index) {return (E) elementData[index]; }
ArrayList的底層是數(shù)組,所以查詢的時候直接根據(jù)索引可以很快找到對應的元素,改也是如此,找到index對應元素進行替換。而增加和刪除就涉及到數(shù)組元素的移動,所以會比較慢。
volatile (揮發(fā)物、易變的):變量修飾符,只能用來修飾變量。volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內(nèi)存中重讀該成員變量的值。而且,當成員變量發(fā)生變 化時,強迫線程將變化值回寫到共享內(nèi)存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
transient (暫短的、臨時的):修飾符,只能用來修飾字段。在對象序列化的過程中,標記為transient的變量不會被序列化。
源碼:
// 增
public boolean add(E e) {
final ReentrantLock lock = this.lock;
//獲得鎖
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
//復制一個新的數(shù)組
Object[] newElements = Arrays.copyOf(elements, len + 1);
//插入新值
newElements[len] = e;
//將新的數(shù)組指向原來的引用
setArray(newElements);
return true;
} finally {
//釋放鎖
lock.unlock();
}
}
public void add(int index, E element) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
if (index > len || index < 0)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+len);
Object[] newElements;
int numMoved = len - index;
if (numMoved == 0)
newElements = Arrays.copyOf(elements, len + 1);
else {
newElements = new Object[len + 1];
System.arraycopy(elements, 0, newElements, 0, index);
System.arraycopy(elements, index, newElements, index + 1,
numMoved);
}
newElements[index] = element;
setArray(newElements);
} finally {
lock.unlock();
}
}
// 刪
public E remove(int index) {
final ReentrantLock lock = this.lock;
//獲得鎖
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
E oldValue = get(elements, index);
int numMoved = len - index - 1;
if (numMoved == 0)
//如果刪除的元素是最后一個,直接復制該元素前的所有元素到新的數(shù)組
setArray(Arrays.copyOf(elements, len - 1));
else {
//創(chuàng)建新的數(shù)組
Object[] newElements = new Object[len - 1];
//將index+1至最后一個元素向前移動一格
System.arraycopy(elements, 0, newElements, 0, index);
System.arraycopy(elements, index + 1, newElements, index,
numMoved);
setArray(newElements);
}
return oldValue;
} finally {
lock.unlock();
}
}
// 改
public E set(int index, E element) {
final ReentrantLock lock = this.lock;
//獲得鎖
lock.lock();
try {
Object[] elements = getArray();
E oldValue = get(elements, index);
if (oldValue != element) {
int len = elements.length;
//創(chuàng)建新數(shù)組
Object[] newElements = Arrays.copyOf(elements, len);
//替換元素
newElements[index] = element;
//將新數(shù)組指向原來的引用
setArray(newElements);
} else {
// Not quite a no-op; ensures volatile write semantics
setArray(elements);
}
return oldValue;
} finally {
//釋放鎖
lock.unlock();
}
}
// 查
//直接獲取index對應的元素
public E get(int index) {return get(getArray(), index);}
private E get(Object[] a, int index) {return (E) a[index];}
增刪改都需要獲得鎖,并且鎖只有一把,而讀操作不需要獲得鎖,支持并發(fā)。
CopyOnWrite容器有很多優(yōu)點,但是同時也存在兩個問題,即內(nèi)存占用問題和數(shù)據(jù)一致性問題。
Vector是增刪改查方法都加了synchronized,保證同步,但是每個方法執(zhí)行的時候都要去獲得鎖,性能就會大大下降,而CopyOnWriteArrayList 只是在增刪改上加鎖,但是讀不加鎖,在讀方面的性能就好于Vector,CopyOnWriteArrayList支持讀多寫少的并發(fā)情況。
分享文章:ArrayList和CopyOnWriteArrayList-創(chuàng)新互聯(lián)
本文來源:http://www.rwnh.cn/article38/coposp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、品牌網(wǎng)站制作、微信小程序、App設計、外貿(mào)網(wǎng)站建設、網(wǎng)頁設計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)