亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java的構造方法Vevtor添加元素的實例分析

發布時間:2021-09-09 16:41:10 來源:億速云 閱讀:129 作者:chen 欄目:開發技術

本篇內容主要講解“java的構造方法Vevtor添加元素的實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java的構造方法Vevtor添加元素的實例分析”吧!

前言

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

add(E)方法分析

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

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

1、首先修改modCount值

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

2、然后檢查底層數組容量能否再添加一個新的元素

通過調用ensureCapacityHelper()方法檢查,傳入參數是實際元素總數+1后的一個值,用于確認當前數組的容量是否需要擴充容量,如果數組的容量無法再添加一個新的元素,則在此方法中會對當前Vector對象持有的數組對象進行容量擴充(擴容的方法,將在單獨的文章中分析,這里只需知道,容量不夠,先擴容)

3、將元素賦值到數組對象中某個下標處,并增加表示元素總數的實例變量

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

4、返回添加元素的結果

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

add(int,E)方法分析

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

用于在指定下標處添加一個元素的方法,第一個參數index表示指定的下標,第二個參數element表示添加的元素

方法體中調用insertElementAt()方法,并將傳入的index、element兩個參數同時傳入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++;
    }

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

1、最先修改modCount值

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

2、檢查傳入的下標值是否合法

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

3、檢查是否需要擴容

調用ensureCapacityHelper()方法,同時將elementCount+1的值傳了進去

4、拷貝數組元素,騰出一個空余位置

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

5、向指定位置插入元素

已經騰出空余空間,只需將元素插入到數組的指定下標處即可

6、元素總數增加

Vector對象持有的elementCount增加1 

addElement()方法分析

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

同樣為synchronized修飾,添加一個元素的方法,有一點和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;
    }

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

1、為modCount值增加1,表示Vecor對象持有的元素發生改變,fail-fast機制會用到該值

2、先將Collection對象,轉換成一個Object[]數組對象,并由局部變量a負責保存

3、獲取轉換數組后的長度,由局部變量numNew負責保存

4、調用ensureCpacityHelper()方法,將需要的新容量(elementCount+numNew)傳入進去,檢查現有數組容量能否存儲下新的元素數量

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

6、更新elementCount總數

7、返回添加結果,只要添加的數量不是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;
    }

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

1、更新modCount值,用于fail-fast機制檢測

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

3、Collection對象轉數組對象

4、獲取轉換后數組對象的長度

5、確認是否需要擴容數組容量

6、計算需要移動元素的數量

7、確定需要移動元素,使用System的靜態方法arraycopy()移動元素

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

9、更新元素總數值

10、返回添加結果,不為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;
        }

迭代器對象,可以添加元素,必須可以

1、先將遍歷到哪個元素的游標保存到局部變量i中

2、只有獲取到對象鎖的線程,才能執行該代碼塊,此處仍為當前Vector對象作為對象鎖

檢查fail-fast機制

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

更新一個預期值,expetcedModCount,這個也是用于fail-fast機制檢測用的

3、更新游標值,增加1

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

到此,相信大家對“java的構造方法Vevtor添加元素的實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥中县| 文水县| 安阳市| 祁东县| 光泽县| 宁阳县| 墨玉县| 昆明市| 三原县| 连平县| 和平县| 即墨市| 鸡西市| 黎平县| 克拉玛依市| 巫山县| 射阳县| 天峨县| 南涧| 收藏| 保德县| 正宁县| 五台县| 花莲市| 阜新市| 孟津县| 东山县| 宣城市| 长汀县| 托克托县| 张北县| 屏东县| 阆中市| 来凤县| 济南市| 左权县| 万州区| 南和县| 化州市| 新宾| 开封市|