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