java集合框架>>>>Vector

 

目录

前言

类的简介

构造方法

1. public Vector() {}

2. public Vector(int initialCapacity) {}

3. public Vector(int initialCapacity, int capacityIncrement) {}

4. public Vector(Collection c)

其他方法:

1. public int size()

2. public synchronized boolean isEmpty()

3. public Enumeration elements()

4. public boolean contains(Object o)

5. public int indexOf(Object o)

6. public synchronized int indexOf(Object o, int index)

7. public synchronized int lastIndexOf(Object o, int index)

8. public synchronized int lastIndexOf(Object o)

9. public synchronized E elementAt(int index)

...

总结:


前言

Vector和ArrayList很相似,可能唯一差别,就是Vector是线程安全的,因为Vector大部分方法都是由synchronized修饰的,因此Vector更适合多线程,ArrayList更适合单线程

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

二者都继承AbstractList<E>这个抽象类,因此大部分方法也是继承自这个类,因此大家可以参考我前面写的文章,对比学习

Java集合框架----ArrayList

因此这篇博客,直接根据API查看主要方法,简单分析一下实现

类的简介

Vector类主要参数以及构造方法如下

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    //数据元素
    protected Object[] elementData;
    //集合大小,相当于ArrayList的size属性
    protected int elementCount;
    //扩充集合时,每次增加量,当需要扩充容量时
    protected int capacityIncrement;
    
    //构造方法

    //其他方法

}

主要属性

elementData,用来存储元素

elementCount,记录当前集合的长度

capacityIncrement,扩容时每次增加的容量,默认为0

构造方法

1. public Vector() {}

2. public Vector(int initialCapacity) {}

3. public Vector(int initialCapacity, int capacityIncrement) {}

看起来是四种构造方法,其实也就是两种,附前三种构造方法的源码

    public Vector() {
        this(10);
    }

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

都是隐式的调用了第三种构造方法,初始化elementData,以及capacityIncrement参数,如果初始容量小于0,则抛出异常

当时脑子不知道怎么想的,,,纠结了一个问题,怎么构造方法中没有设置elementCount的值,elementCount未设置初始值,默认为0,那么此时获取Vector不就是0吗,那么初始容量为10???

只是初始化elementData的容量为10,但是没有往里面添加元素,因此就不需要管elementCount,此时调用size返回0,也是正常,因为这就是个空的集合

需要注意的是:

如果没有给capacityIncrement设置初始值,则每次给集合扩容,都是将集合扩大一倍

4. public Vector(Collection<? extends E> c)

构造一个包含指定集合元素的向量,按照集合的迭代器返回的顺序。

    public Vector(Collection<? extends E> c) {
        elementData = c.toArray();
        elementCount = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
    }

将参数Collection调用toArray方法转化为Object[]并赋值给elementData

更新集合长度elementCount

同时进行容错处理,如果toArray方法返回错误类型,也就是说第一行赋值出现错误,可能类型不一致,因此在调用Arrays.copyOf方法重新赋值

其他方法:

Vector是线程安全的,因此所有方法都带有"synchronized"修饰

1. public int size()

返回Vector集合元素个数

详情参考ArrayList部分的源码分析

2. public synchronized boolean isEmpty()

判断集合长度是否为空

详情参考ArrayList部分的源码分析

3. public Enumeration<E> elements()

Enumeration貌似已经被Iterator迭代器取代了...

这里不在做分析

4. public boolean contains(Object o)

如果集合包含指定的元素,则返回true 。 更正式地,返回true当且仅当该向量包含至少一个元素e使得(o==null ? e==null : o.equals(e)) 

其实就是调用IndexOf方法,如果返回值大于0,则证明存在该对象

5. public int indexOf(Object o)

返回参数对象在该集合中第一次出现的索引,如果不存在,则返回-1

其实就是调用indexOf(Object o,index i)这个方法,从index位置处开始检索

6. public synchronized int indexOf(Object o, int index)

    public synchronized int indexOf(Object o, int index) {
        if (o == null) {
            for (int i = index ; i < elementCount ; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index ; i < elementCount ; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

从index位置开始检索,检索到则返回索引,否则返回-1

7. public synchronized int lastIndexOf(Object o, int index)

返回此向量中指定元素的最后一次出现的索引,从index ,如果未找到该元素,则返回-1。 更正式地,返回最高指数i ,使(i <= index && (o==null ? get(i)==null : o.equals(get(i)))) ,或-1如果没有这样的索引。

8. public synchronized int lastIndexOf(Object o)

返回此向量中指定元素的最后一次出现的索引,如果此向量不包含元素,则返回-1。 更正式地,返回最高指数i ,使(o==null ? get(i)==null : o.equals(get(i))) ,或-1如果没有这样的索引。

9. public synchronized E elementAt(int index)

相当于get(int index)

返回指定索引处的组件

...

其余方法均继承自AbstractList,ArrayList部分已经分析过,实现思路基本相同,这里不在分析

详情见

Java集合框架----ArrayList

总结:

实质上,Vector就是ArrayList的一个强化版,所有方法均是同步的,因此使用多线程时Vector更适合

而不实用多线程,ArrayList性能则更好

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章