基於java構造方法Vector查找元素源碼分析

(註意:本文基於JDK1.8)

前言

元素在存儲到內存中,當我們需要使用在內存中存儲的元素,這就涉及到在內存中查找元素,今天一起學習Vector提供瞭哪些查找元素的方法

包括有獲取一個元素的方法,查找元素的下標的方法,檢查是否包含某個元素的方法,一起逐個學習一下吧……(本文不涉及迭代器中的查找元素,以及遍歷元素,迭代器將在單獨的文章中總結)

get(int)方法分析

    public synchronized E get(int index) {
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);
 
        return elementData(index);
    }

用於獲取指定下標處的元素對象,傳入的參數index表示指定的下標,當然隻有獲得對象鎖的線程才能執行此方法

1、檢查下標index是否合法

同樣當index大於等於elementCount值,說明不合法,此處會拋出ArrayIndexOutOfBoundsException對象,告知用戶錯誤原因,elementCount在Vector中有兩個作用,一個是作為即將添加的下標,另外一個是作為Vector對象實際持有的元素總數

2、獲取元素

獲取元素仍然使用的是elementData()方法,它可以返回某個下標處的元素對象

3、向調用者返回元素對象

contains(Object)方法分析

    public boolean contains(Object o) {
        return indexOf(o, 0) >= 0;
    }

用於檢查Vector中是否存在某個元素對象

1、先調用indexOf()方法獲取到某個元素的下標

2、比較獲取到的元素是否大於等於0,如果元素存在,indexOf()一定會返回一個大於等於0的數字

3、將比較結果返回給調用者

如果你留心,你會發現contains()方法並沒有使用synchronized修飾

containsAll()方法分析

    public synchronized boolean containsAll(Collection<?> c) {
        return super.containsAll(c);
    }

用於檢查是否包含某個指定的Collection中的所有元素的方法,依賴於父類的containsAll()方法

indexOf(Object)方法分析

    public int indexOf(Object o) {
        return indexOf(o, 0);
    }

用於檢查某個元素對象在Vector對象持有的數組對象中的下標,傳入參數o為元素對象

1、實際調用另一個重載的indexOf()方法

2、向調用者返回結果,即元素的下標

indexOf(Object,index)方法分析

    public synchronized int indexOf(Object o, int index) {
        if (o == null) {
            for (int i = index ; i < elementCount ; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index ; i < elementCount ; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

用於獲得元素的下標,第一個參數o表示查找的元素對象,第二個參數index表示從哪個下標開始查找元素對象的下標……

1、當元素對象為null時

從指定的下標index處開始,遍歷到elementCount前的所有元素,如果與null相同,則返回下標值

2、當元素對象不是null時

使用對象的equals()方法進行比較,當相等時,返回遍歷過程中的下標值

3、如果沒有在指定范圍內找到匹配的元素對象,則向調用者返回-1

lastIndexOf(Object)方法分析

    public synchronized int lastIndexOf(Object o) {
        return lastIndexOf(o, elementCount-1);
    }

從最後一個元素開始查找,一直到第一個元素,同樣返回元素對象的下標

1、實際調用重載的lastIndexOf(Object,int)方法

2、向調用者返回元素的下標

elementAt(int)方法分析

    public synchronized E elementAt(int index) {
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
        }
 
        return elementData(index);
    }

用於查找某個下標處的元素,synchronized修飾,同一時刻隻有獲得對象鎖的線程,才能執行該方法,傳入的參數index表示指定的下標

1、檢查下標是否合理

隻有小於elementCount的下標才是合法下標,其它情況會以ArrayIndexOutOfBoundsException告知調用者

2、查找到元素

這是通過elementData()方法實現的

3、向調用者返回元素對象

firstElement()方法分析

    public synchronized E firstElement() {
        if (elementCount == 0) {
            throw new NoSuchElementException();
        }
        return elementData(0);
    }

用於查找Vector中存儲的第一個元素

1、檢查元素數量

當elementCount等於0,說明沒有元素,此時拋出NoSuchElementException對象

2、查找到具體的元素

同樣通過elementData()方法獲取到,elementData()方法接受的參數為元素下標值

3、向調用者返回元素對象

lastElement()方法分析

    public synchronized E lastElement() {
        if (elementCount == 0) {
            throw new NoSuchElementException();
        }
        return elementData(elementCount - 1);
    }

用於返回Vector中存儲的最後一個元素,同步方法,保證共享變量elementData、elementCount的線程安全

1、檢查元素數量

同樣為0,表示沒有元素,同樣拋出NoSuchElementException對象,以告知用戶,並沒有元素

2、查找到最後一個元素

使用elementData()方法,隻需傳入最後一個元素的下標值即可,elementCount – 1 即為最後一個元素的下標

3、向調用者返回元素對象

elementData(int)方法分析

    E elementData(int index) {
        return (E) elementData[index];
    }

用於返回指定下標處的元素對象,傳入參數為int,表示下標

1、通過下標訪問數組中的元素

elementData是Vector對象持有的一個數組對象,該數組對象實際負責保存元素對象(引用),所以隻需通過下標訪問elementData中的元素即可

2、向調用者返回元素對象

總結

查找元素功能經常使用,當然實際訪問的是還是Vector對象持有的elementData數組對象

以上就是基於java構造方法Vector查找元素源碼分析的詳細內容,更多關於java構造方法Vector查找元素的資料請關註WalkonNet其它相關文章!

推薦閱讀: