最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于java構(gòu)造方法Vevtor添加元素源碼分析

 更新時(shí)間:2021年09月09日 17:36:54   作者:叫我王員外就行  
這篇文章主要介紹了基于java構(gòu)造方法中對(duì)Vevtor添加元素的源碼分析,有需要的朋友可以借鑒參考下,希望可以對(duì)大家有所幫助,祝大家早日升職加薪

(注意:本文基于JDK1.8)

前言

算上迭代器的add()方法,Vector中一共有7個(gè)添加元素的方法,5個(gè)添加單個(gè)元素的方法,2個(gè)添加多個(gè)元素的方法,接下來就一起分析它們的實(shí)現(xiàn)……Vector是一個(gè)線程安全的容器類,它的添加功能是如何做到線程安全的呢?

add(E)方法分析

    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

用于添加1個(gè)元素的方法,由synchronized修飾,只有獲得對(duì)象鎖的線程才可以執(zhí)行該方法,其它未獲得對(duì)象鎖的線程會(huì)blocked在方法的入口處,等待已經(jīng)持有對(duì)象鎖的線程釋放對(duì)象鎖,傳入的參數(shù)為即將要添加的元素對(duì)象,類型為指定的類型參數(shù)E

1、首先修改modCount值

Vecotor的父類AbstractList中,定義了實(shí)例變量modCount,這意味著每個(gè)Vector對(duì)象也持有一個(gè)modCount,這里將其+1,表示當(dāng)前Vector對(duì)象持有的元素發(fā)生變化,這個(gè)modCount值是用于防止用戶在多線程下使用容器類而設(shè)計(jì)的,常被稱為fail-fast機(jī)制,可Vector本身是線程安全的容器類,為何這里還在使用modCount做++呢?費(fèi)解……

2、然后檢查底層數(shù)組容量能否再添加一個(gè)新的元素

通過調(diào)用ensureCapacityHelper()方法檢查,傳入?yún)?shù)是實(shí)際元素總數(shù)+1后的一個(gè)值,用于確認(rèn)當(dāng)前數(shù)組的容量是否需要擴(kuò)充容量,如果數(shù)組的容量無法再添加一個(gè)新的元素,則在此方法中會(huì)對(duì)當(dāng)前Vector對(duì)象持有的數(shù)組對(duì)象進(jìn)行容量擴(kuò)充(擴(kuò)容的方法,將在單獨(dú)的文章中分析,這里只需知道,容量不夠,先擴(kuò)容)

3、將元素賦值到數(shù)組對(duì)象中某個(gè)下標(biāo)處,并增加表示元素總數(shù)的實(shí)例變量

先使用Vector對(duì)象持有的elmentCount作為數(shù)組下標(biāo),將新增加的元素賦值給elementData數(shù)組中對(duì)應(yīng)的下標(biāo)處,接著將表示實(shí)際持有元素的總數(shù)值的elementCount增加1,這里的實(shí)例變量elementCount同時(shí)扮演著兩個(gè)角色,一個(gè)是用于記錄Vector對(duì)象實(shí)際持有的元素總數(shù),另一個(gè)是用于作為Vector對(duì)象持有的底層數(shù)組對(duì)象的下標(biāo)!

4、返回添加元素的結(jié)果

每次都會(huì)返回true,表示添加元素成功

add(int,E)方法分析

    public void add(int index, E element) {
        insertElementAt(element, index);
    }

用于在指定下標(biāo)處添加一個(gè)元素的方法,第一個(gè)參數(shù)index表示指定的下標(biāo),第二個(gè)參數(shù)element表示添加的元素

方法體中調(diào)用insertElementAt()方法,并將傳入的index、element兩個(gè)參數(shù)同時(shí)傳入insertElementAt()方法中,由insertElementAt()方法完成元素的添加

insertElementAt()方法分析

    public synchronized void insertElementAt(E obj, int index) {
        modCount++;
        if (index > elementCount) {
            throw new ArrayIndexOutOfBoundsException(index
                                                     + " > " + elementCount);
        }
        ensureCapacityHelper(elementCount + 1);
        System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
        elementData[index] = obj;
        elementCount++;
    }

用于在指定下標(biāo)處添加1個(gè)元素的方法,第一參數(shù)obj表示添加的元素對(duì)象,第二個(gè)參數(shù)index表示指定的下標(biāo)……(注意:這里的參數(shù)順序,真是老外思路),同樣由synchronized修飾,只有獲取到對(duì)象鎖的線程才能執(zhí)行該方法,未獲取到對(duì)象鎖的線程處于方法入口處,并處于blocked狀態(tài)

1、最先修改modCount值

實(shí)例變量modCount定義在父類AbstractList中,它用于防止容器類在多線程下使用,常稱為fail-fast機(jī)制i,此處將該值增加1,表示Vector對(duì)象持有的元素發(fā)生改變

2、檢查傳入的下標(biāo)值是否合法

如果傳入的下標(biāo)值index大于Vector對(duì)象實(shí)際持有的元素總數(shù)elementCount值,此時(shí)拋出ArrayIndexOutOfBoundsException對(duì)象,并提示用戶"index > elementCount"(替換為實(shí)際值)

3、檢查是否需要擴(kuò)容

調(diào)用ensureCapacityHelper()方法,同時(shí)將elementCount+1的值傳了進(jìn)去

4、拷貝數(shù)組元素,騰出一個(gè)空余位置

通過System的靜態(tài)方法arraycopy()完成元素的拷貝,arraycopy()的第一個(gè)參數(shù)為源數(shù)組對(duì)象,第二個(gè)參數(shù)為源數(shù)組對(duì)象的起始下標(biāo)(從哪個(gè)元素開始拷貝),第三個(gè)參數(shù)為目標(biāo)數(shù)組對(duì)象,第四個(gè)參數(shù)為目標(biāo)數(shù)組對(duì)象的起始下標(biāo)(從哪個(gè)元素開始粘貼),第五個(gè)參數(shù)為需要拷貝的元素?cái)?shù)量!此處只需挪出一個(gè)位置,即可存放即將要插入的元素!

5、向指定位置插入元素

已經(jīng)騰出空余空間,只需將元素插入到數(shù)組的指定下標(biāo)處即可

6、元素總數(shù)增加

Vector對(duì)象持有的elementCount增加1 

addElement()方法分析

    public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = obj;
    }

同樣為synchronized修飾,添加一個(gè)元素的方法,有一點(diǎn)和add()方法不同,它沒有返回值…………,幾乎都一樣,這里不再冗余分析

addAll()方法分析

    public synchronized boolean addAll(Collection<? extends E> c) {
        modCount++;
        Object[] a = c.toArray();
        int numNew = a.length;
        ensureCapacityHelper(elementCount + numNew);
        System.arraycopy(a, 0, elementData, elementCount, numNew);
        elementCount += numNew;
        return numNew != 0;
    }

 用于添加多個(gè)元素的方法,傳入的參數(shù)為Collection對(duì)象,表示持有多個(gè)元素的集合對(duì)象,本身方法同樣是由synchronized修飾

1、為modCount值增加1,表示Vecor對(duì)象持有的元素發(fā)生改變,fail-fast機(jī)制會(huì)用到該值

2、先將Collection對(duì)象,轉(zhuǎn)換成一個(gè)Object[]數(shù)組對(duì)象,并由局部變量a負(fù)責(zé)保存

3、獲取轉(zhuǎn)換數(shù)組后的長度,由局部變量numNew負(fù)責(zé)保存

4、調(diào)用ensureCpacityHelper()方法,將需要的新容量(elementCount+numNew)傳入進(jìn)去,檢查現(xiàn)有數(shù)組容量能否存儲(chǔ)下新的元素?cái)?shù)量

5、使用System的靜態(tài)方法arraycopy(),復(fù)制新的元素到舊的數(shù)組中,完成添加元素行為

6、更新elementCount總數(shù)

7、返回添加結(jié)果,只要添加的數(shù)量不是0,說明添加元素成功

addAll(int,Collection)方法分析

    public synchronized boolean addAll(int index, Collection<? extends E> c) {
        modCount++;
        if (index < 0 || index > elementCount)
            throw new ArrayIndexOutOfBoundsException(index); 
        Object[] a = c.toArray();
        int numNew = a.length;
        ensureCapacityHelper(elementCount + numNew); 
        int numMoved = elementCount - index;
        if (numMoved > 0)
            System.arraycopy(elementData, index, elementData, index + numNew,
                             numMoved); 
        System.arraycopy(a, 0, elementData, index, numNew);
        elementCount += numNew;
        return numNew != 0;
    }

在指定位置添加多個(gè)元素的方法,傳入的參數(shù)index表示指定的下標(biāo)、傳入的參數(shù)c表示要添加元素集合對(duì)象,同樣為synchronized修飾,只有獲取到對(duì)象鎖的線程才能執(zhí)行該方法,java的線程間同步做的真的太好!

1、更新modCount值,用于fail-fast機(jī)制檢測(cè)

2、檢查下標(biāo)范圍是否合法,不合法拋出ArrayIndexOutOfBoundsException提示用戶

3、Collection對(duì)象轉(zhuǎn)數(shù)組對(duì)象

4、獲取轉(zhuǎn)換后數(shù)組對(duì)象的長度

5、確認(rèn)是否需要擴(kuò)容數(shù)組容量

6、計(jì)算需要移動(dòng)元素的數(shù)量

7、確定需要移動(dòng)元素,使用System的靜態(tài)方法arraycopy()移動(dòng)元素

8、將新插入的所有元素,都賦值到elementData數(shù)組中,就從指定下標(biāo)index開始

9、更新元素總數(shù)值

10、返回添加結(jié)果,不為0,即為True

ListItr中的add()方法分析

        public void add(E e) {
            int i = cursor;
            synchronized (Vector.this) {
                checkForComodification();
                Vector.this.add(i, e);
                expectedModCount = modCount;
            }
            cursor = i + 1;
            lastRet = -1;
        }

迭代器對(duì)象,可以添加元素,必須可以

1、先將遍歷到哪個(gè)元素的游標(biāo)保存到局部變量i中

2、只有獲取到對(duì)象鎖的線程,才能執(zhí)行該代碼塊,此處仍為當(dāng)前Vector對(duì)象作為對(duì)象鎖

檢查fail-fast機(jī)制

使用Vector的add(int,E)方法進(jìn)行添加元素

更新一個(gè)預(yù)期值,expetcedModCount,這個(gè)也是用于fail-fast機(jī)制檢測(cè)用的

3、更新游標(biāo)值,增加1

4、更新迭代器對(duì)象持有的lastRet值為-1,表示上一次并沒有進(jìn)行遍歷元素的行為

總結(jié)

1、Vector使用了一手synchronized,這也是導(dǎo)致效率變低的原因

2、假設(shè)1個(gè)線程執(zhí)行插入操作需要5s,而其它n個(gè)線程操作任意一個(gè)Vecotor的方法,因?yàn)闆]有持有當(dāng)前的Vector對(duì)象鎖,所有的n個(gè)線程都被阻塞了……,同一時(shí)刻,只有1個(gè)線程能操作Vector的1個(gè)方法

3、如果只是讀的操作,完全沒有必要線程間同步啊,畢竟讀的內(nèi)存值一直沒變啊,所以后來大牛不建議使用Vector

以上就是基于java構(gòu)造方法Vevtor添加元素源碼分析的詳細(xì)內(nèi)容,更多關(guān)于java構(gòu)造方法Vevtor的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java無法輸出中文問題及解決

    Java無法輸出中文問題及解決

    這篇文章主要介紹了Java無法輸出中文問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • java使用多線程讀取超大文件

    java使用多線程讀取超大文件

    這篇文章主要為大家詳細(xì)介紹了java使用多線程讀取超大文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • JAVA十大排序算法之桶排序詳解

    JAVA十大排序算法之桶排序詳解

    這篇文章主要介紹了java中的桶排序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java中memcached的cache機(jī)制

    Java中memcached的cache機(jī)制

    這篇文章主要介紹了Java中memcached的cache機(jī)制,在Java中使用Memcached的緩存機(jī)制需要使用Java的Memcached客戶端庫。Memcached是一個(gè)高性能的分布式內(nèi)存緩存系統(tǒng),可以用來緩存常用的數(shù)據(jù),需要的朋友可以參考下
    2023-07-07
  • Java根據(jù)url生成圖片、截圖效果

    Java根據(jù)url生成圖片、截圖效果

    文章詳細(xì)介紹了如何使用Java和Node.js結(jié)合Puppeteer庫根據(jù)URL截圖,并將圖片轉(zhuǎn)換為標(biāo)準(zhǔn)輸出流返回給Java程序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • 淺談利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問題

    淺談利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問題

    本篇文章主要介紹了淺談利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問題,具有一定的參考價(jià)值,有需要的可以了解一下
    2017-08-08
  • SpringBoot如何通過devtools實(shí)現(xiàn)熱部署

    SpringBoot如何通過devtools實(shí)現(xiàn)熱部署

    這篇文章主要介紹了SpringBoot如何通過devtools實(shí)現(xiàn)熱部署,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java中的延遲隊(duì)列DelayQueue詳細(xì)解析

    Java中的延遲隊(duì)列DelayQueue詳細(xì)解析

    這篇文章主要介紹了Java中的延遲隊(duì)列DelayQueue詳細(xì)解析,JDK自身支持延遲隊(duì)列的數(shù)據(jù)結(jié)構(gòu),其實(shí)類:java.util.concurrent.DelayQueue,<BR>我們通過閱讀源碼的方式理解該延遲隊(duì)列類的實(shí)現(xiàn)過程,需要的朋友可以參考下
    2023-12-12
  • 詳解spring mvc對(duì)異步請(qǐng)求的處理

    詳解spring mvc對(duì)異步請(qǐng)求的處理

    spring mvc3.2及以上版本增加了對(duì)請(qǐng)求的異步處理,是在servlet3的基礎(chǔ)上進(jìn)行封裝的,有興趣的可以了解一下。
    2017-01-01
  • java tostring方法重寫代碼示例

    java tostring方法重寫代碼示例

    這篇文章主要介紹了java tostring方法重寫代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10

最新評(píng)論

大渡口区| 本溪| 安岳县| 永福县| 钟山县| 秦皇岛市| 遂溪县| 元氏县| 故城县| 蕉岭县| 长子县| 长葛市| 宁海县| 阿克| 合山市| 临猗县| 祁东县| 东至县| 全南县| 石泉县| 易门县| 宜兰县| 沾化县| 将乐县| 娄底市| 慈利县| 莱阳市| 祁阳县| 射阳县| 辽源市| 两当县| 定州市| 苗栗市| 衡阳市| 讷河市| 二连浩特市| 基隆市| 大姚县| 灌阳县| 沙坪坝区| 枣庄市|