美文网首页
Vector详解(Java)

Vector详解(Java)

作者: 雁度寒崖 | 来源:发表于2019-08-22 16:14 被阅读0次
    Vector是Java的一个List实现类(实现List接口)

    Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:
    Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。
    Vector 类支持 4 种构造方法。
    源码如下:

    1.第一种构造方法创建一个默认的向量,默认大小为 10:

    public Vector() {
            this(10);
        }
    
    

    2.第二种构造方法创建指定大小的向量。

    public Vector(int initialCapacity) {
            this(initialCapacity, 0);
        }
    

    3.第三种构造方法创建指定大小的向量,并且增量用 capacityIncrement 指定。增量表示向量每次增加的元素数目。

    public Vector(int initialCapacity, int capacityIncrement) {
            super();
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
            this.elementData = new Object[initialCapacity];
            this.capacityIncrement = capacityIncrement;
        }
    

    4.第四种构造方法创建一个包含集合 c 元素的向量:

    public Vector(Collection<? extends E> c) {
            elementData = c.toArray();
            elementCount = elementData.length;
            // defend against c.toArray (incorrectly) not returning Object[]
            // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
        }
    
    Vector常用的方法:

    1.返回Vector的容量(记住是容量不是大小)

    public synchronized int capacity() {
            return elementData.length;
        }
    

    2.返回Vector的大小(这才是大小,这是在Collection接口里面就定义的方法,用过List的肯定知道)

    public synchronized int size() {
            return elementCount;
        }
    

    3.返回Vector是否为空(这也是在Collection接口里面就定义的方法,用过List的肯定也知道)

    public synchronized boolean isEmpty() {
            return elementCount == 0;
        }
    

    4.返回Vector中遇到的第一个匹配的元素的下表

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

    5.在此向量的指定位置插入指定的元素。

    public void add(E e) {
                int i = cursor;
                synchronized (Vector.this) {
                    checkForComodification();
                    Vector.this.add(i, e);
                    expectedModCount = modCount;
                }
                cursor = i + 1;
                lastRet = -1;
            }
    

    6。将指定元素添加到此向量的末尾。

    public synchronized boolean add(E e) {
            modCount++;
            add(e, elementData, elementCount);
            return true;
        }
    

    7.将指定 Collection 中的所有元素添加到此向量的末尾,按照指定 collection 的迭代器所返回的顺序添加这些元素。

    public boolean addAll(Collection<? extends E> c) {
            Object[] a = c.toArray();
            modCount++;
            int numNew = a.length;
            if (numNew == 0)
                return false;
            synchronized (this) {
                Object[] elementData = this.elementData;
                final int s = elementCount;
                if (numNew > elementData.length - s)
                    elementData = grow(s + numNew);
                System.arraycopy(a, 0, elementData, s, numNew);
                elementCount = s + numNew;
                return true;
            }
        }
    

    8.在指定位置将指定 Collection 中的所有元素插入到此向量中。

    public synchronized boolean addAll(int index, Collection<? extends E> c) {
            if (index < 0 || index > elementCount)
                throw new ArrayIndexOutOfBoundsException(index);
    
            Object[] a = c.toArray();
            modCount++;
            int numNew = a.length;
            if (numNew == 0)
                return false;
            Object[] elementData = this.elementData;
            final int s = elementCount;
            if (numNew > elementData.length - s)
                elementData = grow(s + numNew);
    
            int numMoved = s - index;
            if (numMoved > 0)
                System.arraycopy(elementData, index,
                                 elementData, index + numNew,
                                 numMoved);
            System.arraycopy(a, 0, elementData, index, numNew);
            elementCount = s + numNew;
            return true;
        }
    

    9.将指定的组件添加到此向量的末尾,将其大小增加 1。

    public synchronized void addElement(E obj) {
            modCount++;
            add(obj, elementData, elementCount);
        }
    

    10.移除此向量中指定位置的元素。

    public synchronized E remove(int index) {
            modCount++;
            if (index >= elementCount)
                throw new ArrayIndexOutOfBoundsException(index);
            E oldValue = elementData(index);
    
            int numMoved = elementCount - index - 1;
            if (numMoved > 0)
                System.arraycopy(elementData, index+1, elementData, index,
                                 numMoved);
            elementData[--elementCount] = null; // Let gc do its work
    
            return oldValue;
        }
    

    11.移除此向量中指定元素的第一个匹配项,如果向量不包含该元素,则元素保持不变。

    public boolean remove(Object o) {
            return removeElement(o);
        }
    

    12.从此向量中移除包含在指定 Collection 中的所有元素。

    public boolean removeAll(Collection<?> c) {
            Objects.requireNonNull(c);
            return bulkRemove(e -> c.contains(e));
        }
    

    13.从此向量中移除全部组件,并将其大小设置为零。

    public synchronized void removeAllElements() {
            final Object[] es = elementData;
            for (int to = elementCount, i = elementCount = 0; i < to; i++)
                es[i] = null;
            modCount++;
        }
    

    14.对此向量的容量进行微调,使其等于向量的当前大小。

    public synchronized void trimToSize() {
            modCount++;
            int oldCapacity = elementData.length;
            if (elementCount < oldCapacity) {
                elementData = Arrays.copyOf(elementData, elementCount);
            }
        }
    

    这些基本就是我常用的几个函数,当然,还有好多,可以考虑去看看源码

    你可能会问这个E是什么类型,没见过啊!!!

    其实很简单,E是一个继承Object的类
    所以你就把他暂时当作Object理解应该暂时也不会遇到大问题!!
    另外附上我抄来的一段代码,这些代码可以有效地帮你理解Vector怎么工作的

    import java.util.*;
    import java.util.function.Consumer;
    
    public class VectorTest {
    
    
        public static void main(String args[]) {
            // initial size is 3, increment is 2
            Vector v = new Vector(3, 2);
    
            System.out.println("Initial size: " + v.size());//组件数
            System.out.println("Initial capacity: " + v.capacity());//容量
    
            v.addElement(1);
            v.addElement(2);
            v.addElement(3);
            v.addElement(4);
            System.out.println("Capacity after four additions: " + v.capacity());
    
            v.addElement(5.45);
            System.out.println("Current capacity five additions: " + v.capacity());
    
            v.addElement(6.08);
            v.addElement(7);
            System.out.println("Current capacity seven additions: " + v.capacity());
    
            v.addElement(8.4f);
            v.addElement(9);
            System.out.println("Current capacity nine additions: " + v.capacity());
    
            v.addElement(10);
            v.addElement(11);
    
            System.out.println("First element: " + v.firstElement());
            System.out.println("Last element: " + v.lastElement());
    
    
            if (v.contains(3))
                System.out.println("Vector contains 3.");
    
            //这是迭代遍历Vector的方法,这种写的是Lambda表达式,是Java8以后新添的功能,如果不习惯,也可以按老方法写
            v.forEach(o -> System.out.print(o + " "));
    
            //这就是老方法的样子了
            v.forEach(new Consumer() {
                @Override
                public void accept(Object o) {
                    System.out.print(o+" ");
                }
            });
      
            System.out.println();
        }
    }
    

    输出结果:

    Initial size: 0
    Initial capacity: 3
    Capacity after four additions: 5
    Current capacity five additions: 5
    Current capacity seven additions: 7
    Current capacity nine additions: 9
    First element: 1
    Last element: 11
    Vector contains 3.
    1 2 3 4 5.45 6.08 7 8.4 9 10 11 1 2 3 4 5.45 6.08 7 8.4 9 10 11 
    

    相关文章

      网友评论

          本文标题:Vector详解(Java)

          本文链接:https://www.haomeiwen.com/subject/jwinsctx.html