zoukankan      html  css  js  c++  java
  • Vector和Stack(已过时,不建议使用)

    以下内容基于jdk1.7.0_79源码;

    什么是Vector和Stack

    Vector:线程安全的动态数组

    Stack:继承Vector,基于动态数组实现的一个线程安全的栈;

    Vector和Stack特点

    Vector与ArrayList基本是一致的,不同的是Vector是线程安全的,会在可能出现线程安全的方法前面加上synchronized关键字;

    Vector:随机访问速度快,插入和移除性能较差(数组的特点);支持null元素;有顺序;元素可以重复;线程安全;

    Stack:后进先出,实现了一些栈基本操作的方法(其实并不是只能后进先出,因为继承自Vector,可以有很多操作,从某种意义上来讲,不是一个栈);

    Vector和Stack继承的类和实现的接口

    以上接口和类中,关于Iterable接口Collection接口List接口RandomAccess、 Cloneable、 java.io.Serializable接口、AbstractCollection类AbstractList类的相关说明,可以参考上一篇:JAVA中的ArrayList,基本都是一样的;剩下Vector类和Stack类如下:

    Vector类

    与ArrayList基本一致,可参考JAVA中的ArrayList,剩下的主要不同点如下:

    1、Vector是线程安全的

    2、ArrayList增长量默认是0.5倍;而Vector的增长量capacityIncrement是可以配置的,如果未指定(<=0),则大小增长一倍,源码如下:

        private void grow(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                             capacityIncrement : oldCapacity);
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            elementData = Arrays.copyOf(elementData, newCapacity);
        }

    3、其它,如构造方法不一致,Vector可以通过构造方法初始化capacityIncrement,另外还有其它一些方法,如indexOf方法,Vector支持从指定位置开始搜索查找;另外,Vector还有一些功能重复的冗余方法,如addElement,setElementAt方法,之所以这样,是由于历史原因,像addElement方法是以前遗留的,当集合框架引进的时候,Vector加入集合大家族,改成实现List接口,需要实现List接口中定义的一些方法,但是出于兼容考虑,又不能删除老的方法,所以出现了一些功能冗余的旧方法;

    Stack类

    实现了栈的基本操作。方法如下:

    public Stack();

    创建空栈

    public synchronized E peek();

    返回栈顶的值;

    public E push(E item);

    入栈操作;

    public synchronized E pop();

    出栈操作;

    public boolean empty();

    判断栈是否为空;

    public synchronized int search(Object o);

    返回对象在栈中的位置;

    Vector和Stack使用举例

    Vector中的部分方法使用如下,另外Vector的遍历方式跟ArrayList一致,可以用foreach,迭代器,for循环遍历;

    package com.pichen.basis.col;
    
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ListIterator;
    import java.util.Vector;
    
    public class Test {
    
        public static void main(String[] args) {
            Vector<Integer> vector = new Vector<Integer>();
            for(int i = 0; i < 10; i++){
                vector.add(i);
            }
            
            //直接打印
            System.out.println(vector.toString());
            
            //size()
            System.out.println(vector.size());
            
            //contains
            System.out.println(vector.contains(2));
            
            //iterator
            Iterator<Integer> iterator = vector.iterator();
            while(iterator.hasNext()){
                System.out.print(iterator.next() + " ");
            }
            
            //toArray
            Object[] objArr = vector.toArray();
            System.out.println("
    objArr:" + Arrays.asList(objArr));
            Integer[] intArr = vector.toArray(new Integer[vector.size()]);
            System.out.println("intArr:" + Arrays.asList(intArr));
            
            //add
            vector.add(5);
            
            //remove
            vector.remove(5);
            
            System.out.println(vector);
            
            //containsAll
            System.out.println(vector.containsAll(Arrays.asList(5,6)));
            
            //addAll
            vector.addAll(Arrays.asList(555,666));
            System.out.println(vector);
            
            //removeAll
            vector.removeAll(Arrays.asList(555,666));
            System.out.println(vector);
            
            
            //addAll方法
            vector.addAll(5, Arrays.asList(666,666, 6));
            System.out.println(vector);
            
            //get方法
            System.out.println(vector.get(5));
            
            //set方法
            vector.set(5, 55);
            System.out.println(vector.get(5));
            
            //add方法
            vector.add(0, 555);
            System.out.println(vector);
            
            //remove方法
            vector.remove(0);
            System.out.println(vector);
            
            //indexof方法
            System.out.println(vector.indexOf(6));
            
            //lastIndexOf方法
            System.out.println(vector.lastIndexOf(6));
            
            //listIterator方法
            ListIterator<Integer> listIterator = vector.listIterator();
            System.out.println(listIterator.hasPrevious());
            
            //listIterator(index)方法
            ListIterator<Integer> iListIterator = vector.listIterator(5);
            System.out.println(iListIterator.previous());
            
            //subList方法
            System.out.println(vector.subList(5, 7));
            
            //clear
            vector.clear();
            System.out.println(vector);
            
        }
    }

    Stack中的部分方法使用如下,因为Stack继承Vector,所以Vector可以用的方法,Stack同样可以使用,以下列出一些Stack独有的方法的例子,很简单,就是的一些基本操作,另外stack除了Vector的几种遍历方式外,还有自己独有的遍历元素的方式(利用empty方法和pop方法实现栈顶到栈底的遍历):

    package com.pichen.basis.col;
    
    import java.util.Stack;
    
    public class Test {
    
        public static void main(String[] args) {
            Stack<Integer> stack = new Stack<Integer>();
            for(int i = 0; i < 10; i++){
                stack.add(i);
            }
            
            System.out.println(stack);
            
            System.out.println(stack.peek());
            
            stack.push(555);
            
            System.out.println(stack);
            
            System.out.println(stack.pop());
            
            System.out.println(stack);
            
            System.out.println(stack.empty());
            
            System.out.println(stack.search(6));
            
            System.out.println("stack遍历:");
            while(!stack.empty()){
                System.out.print(stack.pop() + " ");
            }
        }
    }

    建议

    Vector是线程安全的,但是性能较差,一般情况下使用ArrayList,除非特殊需求;

    如果打算用Stack作为栈来使用的话,就老老实实严格按照栈的几种操作来使用,否则就是去了使用stack的意义,还不如用Vector;

  • 相关阅读:
    3927Circular Sequence 思维题(求环形最大子列和)
    Rotational Painting(hdu 3685 凸包+多边形重心 模板题
    模拟 3897: Catch the Mouse
    L3-010 是否完全二叉搜索树 (30分)
    已知两种遍历顺序 推剩下的一种
    进阶实验4-3.3 完全二叉搜索树 (30分)->排序得出搜索树中序遍历->已知搜索树中序求层序
    任意进制转化/模板(c++/ java)
    4038: Robot Navigation --bfs(求最短路及其路径条数)
    A Simple Math Problem(hdu 5974 数论题
    LCM Walk(hdu 5584;数论题
  • 原文地址:https://www.cnblogs.com/chenpi/p/5258450.html
Copyright © 2011-2022 走看看