Vector是Java的一個List實(shí)現(xiàn)類(實(shí)現(xiàn)List接口)
Vector 類實(shí)現(xiàn)了一個動態(tài)數(shù)組宰衙。和 ArrayList 很相似能岩,但是兩者是不同的:
Vector 主要用在事先不知道數(shù)組的大小,或者只是需要一個可以改變大小的數(shù)組的情況株灸。
Vector 類支持 4 種構(gòu)造方法崇摄。
源碼如下:
1.第一種構(gòu)造方法創(chuàng)建一個默認(rèn)的向量,默認(rèn)大小為 10:
public Vector() {
this(10);
}
2.第二種構(gòu)造方法創(chuàng)建指定大小的向量慌烧。
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
3.第三種構(gòu)造方法創(chuàng)建指定大小的向量逐抑,并且增量用 capacityIncrement 指定。增量表示向量每次增加的元素數(shù)目杏死。
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.第四種構(gòu)造方法創(chuàng)建一個包含集合 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.移除此向量中指定元素的第一個匹配項(xiàng)斯嚎,如果向量不包含該元素利虫,則元素保持不變挨厚。
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.從此向量中移除全部組件糠惫,并將其大小設(shè)置為零疫剃。
public synchronized void removeAllElements() {
final Object[] es = elementData;
for (int to = elementCount, i = elementCount = 0; i < to; i++)
es[i] = null;
modCount++;
}
14.對此向量的容量進(jìn)行微調(diào),使其等于向量的當(dāng)前大小硼讽。
public synchronized void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}
}
這些基本就是我常用的幾個函數(shù)巢价,當(dāng)然,還有好多固阁,可以考慮去看看源碼
你可能會問這個E是什么類型壤躲,沒見過啊1溉肌F饩簟!
其實(shí)很簡單赚爵,E是一個繼承Object的類
所以你就把他暫時當(dāng)作Object理解應(yīng)該暫時也不會遇到大問題!法瑟!
另外附上我抄來的一段代碼冀膝,這些代碼可以有效地幫你理解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());//組件數(shù)
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表達(dá)式霎挟,是Java8以后新添的功能窝剖,如果不習(xí)慣,也可以按老方法寫
v.forEach(o -> System.out.print(o + " "));
//這就是老方法的樣子了
v.forEach(new Consumer() {
@Override
public void accept(Object o) {
System.out.print(o+" ");
}
});
System.out.println();
}
}
輸出結(jié)果:
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