【集合】Java中的Vector
參考:
https://www.cnblogs.com/zheting/p/7708366.html
https://blog.csdn.net/w15971597/article/details/48937701
https://www.cnblogs.com/xiaostudy/p/9526270.html
一、Vector的用途
Vector是java.util.vector提供的向量類,以實現類似動態數組的功能。
Vector可擁有時下自動增長的對象數組。
創建了一個向量類的對象后,可以往其中隨意插入不同類的對象,即不需顧及類型、也不需預先選定向量的容量,並可以方便地進行查找。
對於預先不知或者不願預先定義數組大小,並且需要頻繁地進行查找,插入,刪除工作的情況,可以考慮使用向量類。
Vector類中主要成員字段如下:
- elementData:是一個Object類型的數組索引,在構造方法中會通過new方式、或toArray()方式創建存儲空間。在向Vertor中添加對象過程中,如果存儲空間滿,會自動擴充空間。
- elementCount:記錄當前Vector中實際保存的對象個數。size()方法返回的就是本字段值。
- capacityIncrement:當Vector中存儲空間占用完畢后,通過本參數指定每次擴充的擴充量。當capacityincrement為0的時候,則每次擴充一倍。
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
protected Object[] elementData;
protected int elementCount;
protected int capacityIncrement;
}
二、Vector的構造方法
Vector提供了三種構造方法:
public vector()
public vector(int initialcapacity,int capacityIncrement)
public vector(int initialcapacity)
- 構造方法1:系統會自動對向量進行管理。
- 構造方法2、構造方法3:則系統將根據參數設置關聯向量:
- initialcapacity設定向量對象的容量(即向量對象可存儲數據的大小),當真正存放的數據個數超過容量時。系統會擴充向量對象存儲容量。
- capacityincrement給定了每次擴充的擴充值。當capacityincrement為0的時候,則每次擴充一倍,利用這個功能可以優化存儲。
三、Vector的插入方法
1. 向Vector的尾部插入對象
public synchronized boolean add(E e)
public synchronized void addElement(E obj)
將obj插入向量的尾部。obj可以是任何類型的對象。對同一個向量對象,亦可以在其中插入不同類的對象。但插入的應是對象而不是數值,所以插入數值時要注意將數組轉換成相應的對象。
樣例:向Vector中插入Integer對象
Vector v1 = new Vector();
Integer integer1 = new Integer(1);
v1.addElement(integer1);
2. 替換Vector中指定索引的對象
public synchronized void setElementAt(E obj, int index)
將index處的對象設置成obj,原來的對象將被覆蓋。
3. 在Vector指定位置插入對象
public synchronized void insertElementAt(E obj, int index)
在index指定的位置插入obj,原來對象以及此后的對象依次往后順延。
4.把一個集合整體添加到Vector中
public synchronized boolean addAll(Collection<? extends E> c)
樣例:
Vector vector1 = new Vector();
Vector vector2 = new Vector();
vector1.addElement("demo1");
vector1.addElement("demo2");
vector1.addElement("demo3");
vector1.addElement("demo4");
vector2.addAll(vector1);
四、查詢Vector中對象個數
public final int size();
此方法用於獲取向量元素的個數。它們返回值是向量中實際存在的元素個數,而非向量容量。可以調用方法capacity()來獲取容量值。
五、在Vector中搜索對象
1. 獲取Vector中第一個對象
public synchornized E firstElement()
獲取向量中的首個obj 。
2. 獲取Vector中最后一個對象
public synchornized E lastElement()
獲取向量中的最后一個obj 。
3. 指定索引,獲取對象
public synchronized E elementAt(int index)
獲取向量中指定位置的obj 。
4. 從頭搜索指定對象,返回對象所在位置索引
public int indexOf(E obj)
從向量頭開始搜索obj,返回所遇到的第一個obj對應的下標。若不存在此obj,返回-1。
5. 從指定索引位置開始正向搜索指定對象,返回對象所在位置索引
public synchronized int indexOf(E obj, int index)
從index所表示的下標處開始搜索obj,返回所遇到的第一個obj對應的下標。若不存在此obj,返回-1。
6. 從尾搜索指定對象,返回對象所在位置索引
public int lastindexOf(E obj)
從向量尾開始搜索obj,返回所遇到的第一個obj對應的下標。若不存在此obj,返回-1。
7. 從指定索引位置開始逆向搜索指定對象,返回對象所在位置索引
public synchornized int lastIndexOf(E obj, int index)
從index所表示的下標處由尾至頭逆向搜索obj,返回所遇到的第一個obj對應的下標。若不存在此obj,返回-1。
七、從Vector中刪除對象
1. 刪除Vector所有對象
public synchronized void removeAllElement();
刪除向量所有的對象。
2. 指定索引刪除對象
public synchronized void removeElementAt(int index)
刪除index所指的地方的對象。
3. 指定索引范圍,刪除對象
protected synchronized void removeRange(int fromIndex, int toIndex)
3. 指定對象,從首次出現的位置刪除
public synchronized void removeElement(E obj)
從向量中刪除obj對象。若有多個存在,則從向量頭開始,刪除找到的第一個與obj相同的向量成員。
八、遍歷Vector中對象
Vector的elements()方法創建一個匿名類對象,此類包含hasMoreElements()和nextElement()方法,如下:
public Enumeration<E> elements() {
return new Enumeration<E>() {
int count = 0;
public boolean hasMoreElements() {
return count < elementCount;
}
public E nextElement() {
synchronized (Vector.this) {
if (count < elementCount) {
return elementData(count++);
}
}
throw new NoSuchElementException("Vector Enumeration");
}
};
}
Enumeration定義:
public interface Enumeration<E> {
boolean hasMoreElements();
E nextElement();
}
使用樣例:
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
public class TestVector {
public void test01() {
Vector<String> hs = new Vector<String>();
hs.add("aa");
hs.add("bb");
hs.add("aa");
hs.add("cc");
hs.add("aa");
hs.add("dd");
printSet2(hs);
}
public void printSet2(Vector<String> hs) {
Enumeration<String> elements = hs.elements();
while (elements.hasMoreElements()) {
System.out.println(elements.nextElement());
}
}
public static void main(String[] args) {
new TestVector().test01();
}
}
九、其他方法
1. 設置Vector新Size,超過部分丟棄
public synchronized void setSize(int newsize);
此方法用來定義向量的大小,若向量對象現有成員個數已經超過了newsize的值,則超過部分的多余元素丟棄。
2. Vector判空
public synchronized boolean isEmpty()
3. 把向量元素復制到數組中
public synchronized void copyInto(Object[] anArray) {
System.arraycopy(elementData, 0, anArray, 0, elementCount);
}
十、使用Vector創建二維數組
定義樣例:
List intList1 = Arrays.asList(1,4,7,11,15);
List intList2 = Arrays.asList(2,5,8,12,19);
List intList3 = Arrays.asList(3,6,9,16,22);
List intList4 = Arrays.asList(10,13,14,17,24);
List intList5 = Arrays.asList(18,21,23,26,30);
Vector<Integer> v1 = new Vector();
v1.addAll(intList1);
Vector<Integer> v2 = new Vector();
v2.addAll(intList2);
Vector<Integer> v3 = new Vector();
v3.addAll(intList3);
Vector<Integer> v4 = new Vector();
v4.addAll(intList4);
Vector<Integer> v5 = new Vector();
v5.addAll(intList5);
//創建Vector,每個單元保存的是Vector對象
Vector<Vector<Integer> > matrix = new Vector();
matrix.addElement(v1);
matrix.addElement(v2);
matrix.addElement(v3);
matrix.addElement(v4);
matrix.addElement(v5);
for(int i = 0; i < matrix.size(); i++) { //matrix.size()是3
for(int j = 0; j < matrix.elementAt(i).size(); j++) { //每個二維Vector的size()是5
System.out.print(matrix.elementAt(i).elementAt(j) + "\n");
}
}