版本说明:jdk1.7.0_79
一、Vector概述
Vector集合已经成为了一个过时的集合,但是还是有必要研究一下,这样才能明白为什么它会被抛弃。
Vector类与ArrayList一样,都是List接口的不同实现,当然它们会有不同的特征,这也是Java多态的表现。
Vector内部是用数组实现的,这个和ArrayList一样。
二、构造器
public class Vectorextends AbstractList implements List , RandomAccess, Cloneable, java.io.Serializable{ protected Object[] elementData;//用来存储元素 protected int elementCount;//元素数量 protected int 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; } public Vector(int initialCapacity) { this(initialCapacity, 0); } public Vector() { this(10); } public Vector(Collection 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); } …… ……}
创建Vector时,可以指定初始容量initalCapacity和增量(用于自动扩容)。如果没有指定初始容量值,则默认初始容量为10。
因为Vector的实现与ArrayList基本上一样的,所以不再赘述,具体细节请参考
三、Vector和ArrayList的比较
1.扩容
Vector在创建时能够指定增量,如果指定了该增量,当自动扩容时增加的容量就是该增量值。如果创建时没指定增量(或该值<=0),则扩容一倍(容量为原来的两倍)
ArrayList并没有提供能指定增量的构造方法,大约扩容到原来的1.5倍(具体参考)
2.线程安全和效率
Vector的很多方法都是线程安全的,然而java.util.concurrent包中对容器提供了线程安全的实现版本,也就是说Vector被淘汰了。非线程安全时,可以用ArrayList来代替Vetor,需要线程安全时可以使用Collections.synchronizedList(new ArrayList())和CopyOnWriteArrayList。所以Vector注定难逃被淘汰的命运。
ArrayList并不是线程安全的,因此相对来说,ArrayList比Vector效率要高一些。