中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

ArrayList和CopyOnWriteArrayList-創(chuàng)新互聯(lián)

ArrayList和CopyOnWriteArrayList##

參考:ArrayList和CopyOn
WriteArrayList
  • ArrayList和CopyOnWriteArrayList
  • CopyOnWriteArrayList詳解

ArrayList###

  • 底層是數(shù)組,初始大小為10
  • 插入時會判斷數(shù)組容量是否足夠,不夠的話會進行擴容
  • 所謂擴容就是新建一個新的數(shù)組,然后將老的數(shù)據(jù)里面的元素復制到新的數(shù)組里面
  • 移除元素的時候也涉及到數(shù)組中元素的移動,刪除指定index位置的元素,然后將index+1至數(shù)組最后一個元素往前移動一個格

源碼:

為撫寧等地區(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ù)組元素的移動,所以會比較慢。

CopyOnWriteArrayList###

  • 實現(xiàn)了List接口
  • 內(nèi)部持有一個ReentrantLock lock = new ReentrantLock();
  • 底層是用volatile transient聲明的數(shù)組 array
  • 讀寫分離,寫時復制出一個新的數(shù)組,完成插入、修改或者移除操作后將新數(shù)組賦值給array

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的缺點####

CopyOnWrite容器有很多優(yōu)點,但是同時也存在兩個問題,即內(nèi)存占用問題和數(shù)據(jù)一致性問題。

  • 內(nèi)存占用問題。因為CopyOnWrite的寫時復制機制,所以在進行寫操作的時候,內(nèi)存里會同時駐扎兩個對象的內(nèi)存,舊的對象和新寫入的對象
  • 數(shù)據(jù)一致性問題。CopyOnWrite容器只能保證數(shù)據(jù)的最終一致性,不能保證數(shù)據(jù)的實時一致性。所以如果你希望寫入的的數(shù)據(jù),馬上能讀到,請不要使用CopyOnWrite容器。

CopyOnWriteArrayList為什么并發(fā)安全且性能比Vector好####

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)

成都網(wǎng)站建設
云龙县| 新丰县| 翁源县| 嘉峪关市| 道孚县| 雷山县| 岱山县| 渝中区| 博罗县| 珠海市| 达孜县| 浦县| 瑞昌市| 财经| 龙山县| 彭水| 吕梁市| 西华县| 北碚区| 陕西省| 凉山| 苏州市| 黄山市| 洛宁县| 徐闻县| 甘德县| 龙陵县| 英山县| 梓潼县| 循化| 扎赉特旗| 衡阳市| 阜康市| 高陵县| 买车| 蒲城县| 汨罗市| 宜阳县| 噶尔县| 普安县| 科尔|