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<? 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 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容