Vector详解(Java)

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 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 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 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))