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());
        }
    }

 

posted @ 2018-09-12 15:36  小情绪Ango  阅读(164)  评论(0编辑  收藏  举报