1. 程式人生 > >Collection容器家族(Vector講解及Stack原始碼詳解)

Collection容器家族(Vector講解及Stack原始碼詳解)

Vector講解

        Vector類稱作向量類,它實現了動態陣列,用於元素數量變化的物件陣列。像陣列一樣,vector類也用從0開始的下標表示元素的位置;但和陣列不同的是,當vector物件建立後,陣列的元素個數會隨著vector物件元素個數的增大和縮小而自動變化。

        Vector的資料結構和ArrayList差不多,它包含了3個成員變數:elementData , elementCount, capacityIncrement。

(01) elementData 是"Object[]型別的陣列",它儲存了新增到Vector中的元素。elementData是個動態陣列,如果初始化Vector時,沒指定動態陣列的>大小,則使用預設大小10。隨著Vector中元素的增加,Vector的容量也會動態增長,capacityIncrement是與容量增長相關的增長係數,具體的增長方式,請參考原始碼分析中的ensureCapacity()函式。

(02) elementCount 是動態陣列的實際大小。

(03) capacityIncrement 是動態陣列的增長係數。如果在建立Vector時,指定了capacityIncrement的大小;則,每次當Vector中動態陣列容量增加時>,增加的大小都是capacityIncrement。

        但由於它底層資料結構是陣列、查詢快、增刪滿、執行緒不安全,所以不經常使用,通常使用ArrayList代替它。

Stack類詳解

一、Stack繼承的父類、介面及概述

                             

        Stack類,作為java對棧結構的實現,具有先進後出、後進先出的特點。它的實現方式是基於Vector集合類實現的,Stack類自己本身有5個棧的常用方法(壓棧、出棧、檢視棧頂元素、判斷棧是否為空、查詢棧內指定元素),除了這幾個方法外,他還可以使用其父類Vector類的公共方法。但是對於一個棧,基本的的壓棧出棧查詢元素就足夠了。

二、方法詳解

1.進棧方法 push(E item)

    /**
     * 功能:進棧
     * 實現:呼叫父類Vector的addElement方法在陣列尾部新增元素
     */
    public E push(E item) {
        addElement(item);

        return item;
    }

2.出棧 pop()

    /**
     * 功能:出棧
     * 實現:呼叫父類的removeElementAt移除並返回陣列尾部的元素
     */
    public synchronized E pop() {
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }

3.檢視棧頂元素 peek()

    public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

4.判斷棧是否為空 isEmpty()

    public boolean empty() {
        return size() == 0;
    }

5.查詢棧內元素 search(Object obj)

    public synchronized int search(Object o) {
        int i = lastIndexOf(o);

        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }

        Stack類的方法就這5個,他的所有實現功能都是基於Vector類的方法。

三、基本使用Demo

    @Test
    public void test1() {
        Stack<String> stack = new Stack<>();
        stack.push("hello");
        stack.push("world");
        stack.push("java");
        
        System.out.println("empty:" + stack.empty());
        System.out.println("peek:" + stack.peek());
        System.out.println("peek:" + stack.search("world"));

        while (!stack.isEmpty()) {
            System.out.println(stack.pop());
        }
    }