向量和数组的区别
向量和数组相似,都可以保存列表对象。但是数组只能保存固定大小的列表,而向量却提供了一种类似于“动态数组”的功能, 向量与数组的重要区别之一就是向量的容量是可变的 。向量和数组分别适用于不同的场合,一般来说,下列场合更适合于使用向量:
- 如果需要频繁进行对象的插入和删除工作,或者因为需要处理的对象数目不定。
- 列表成员全部都是对象,或者可以方便的用对象表示。
- 需要很快确定列表内是否存在某一特定对象,并且希望很快了解到对象的存放位置。
向量作为一种对象提供了比数组更多的方法,但需要注意的是,向量只能存储对象,不能直接存储简单数据类型,因此下列场合适用于使用数组:
- 所需处理的对象数目大致可以确定。
- 所需处理的是简单数据类型。
向量的使用
向量必须要先创建后使用,向量的大小是向量中元素的个数,向量的容量是被分配用来存储元素的内存大小,其大小总是大于向量的大小。 下面是 Vector 的构造方法:Vector(); //创建空向量,初始大小为 10
Vector(int capacity); //创建初始容量为 capacity 指定的空向量
Vector(int capacity,int incr) //指定向量容量及其增量参数创建空向量
为优化存储管理,Java 的每个向量均可以使用一个“初始容量”和一个“容量增量”,在初始容量满了以后,下一次在存储一个对象到向量中时,这个向量自动为该对象和额外的对象分配空间。通过分配多于所需的内存空间,向量减少了必须的内存分配的数目。这样能够有效地减少分配所消耗的时间,每次分配的额外空间数目将由创建向量时指定的增量所决定。
如果没有指定增量或增量为 0,则该向量的大小在每次分配时都将加倍。除了构造方法外,向量类还提供了三个属性变量,分别为:
protected int capacityIncrement; //当向量大小不足时,所用的增量大小
protected int elementCount; //向量的元素个数
protected Object elementData[]; //向量成员数据所用的缓冲
一旦创建了向量类的实例,就可以用其方法来执行插入、删除以及查找对象等操作,向量类提供了极为丰富的方法,表 8-5 中给出了其中一些主要的方法。
方法 | 功能 |
---|---|
void addElement(Object element) | 将给定对象 element 增加到向量末尾 |
int capacity() | 返回向量容量 |
boolean contains(Object element) | 若向量中包含了 element 返回 true,否则返回 false |
void copyInto(Object Array[]) | 将向量元素复制到指定数组 |
synchronized Object elementAt(int index) | 返回指定下标的元素,若下标非法,抛出 ArrayIndexOutOfBoundsExecption 异常 |
void ensureCapacity(int size) | 将向量的最小容量设为 size |
synchronized Object firstElement() | 返回向量的第一个元素,若向量为空,抛出 NoSuchElementException 异常 |
int indexOf(Object element) | 返回 element 的下标,若对象不存在返回-1 |
int indexOf (Object element,int start) | 从指定位置(start)开始搜索向量,返回对象所对应的下标值,若未找到返回-1 |
void insertElementAt (Object obj,int index) | 将给定的对象插入到指定的下标处 |
boolean isEmpty() | 若向量不包括任何元素,返回 true,否则返回 false |
synchronized Object lastElement() | 返回向量的最后一个元素,若向量为空,抛出 NoSuchElementException 异常 |
int lastIndexOf(Object element) | 从向量末尾向前搜索向量,返回对象的下标值 |
int lastIndexOf(Object element,int start) | 从指定位置开始向前搜索向量,返回给定对象的下标值,若未找到返回-1 |
void removeAllElements() | 删除向量中的所有对象,向量变成空向量 |
boolean removeElement(Object element) | 从向量中删除指定对象 element,若给定的对象在向量中保存多次,则只删除其第一个实例,如果删除成功,返回 true,如果没发现对象,则返回 false |
void removeElementAt(int index) | 删除由 index 指定位置处的元素 |
void setElementAt(Object obj,int index) | 将给定对象存放到给定下标处,该下标处的原有对象丢失 |
void setSize(int size) | 将向量中的元素个数设为 size,如果新的长度小于原来的长度,元素将丢失,若新的长度大于原来的长度,则在其后增加 null 元素 |
int size() | 返回向量中当前元素的个数 |
String toString() | 将向量转换成字符串 |
void trimToSize() | 将向量的容量设为与当前拥有的元素个数相等 |
Vector vector=new Vector();
【例 8-11】测试向量大小和容量的变化及元素的遍历。
//********** ep8_11.java **********
import java.util.*;
class ep8_11{
public static void main(String args[]){
Vector <Integer> v=new Vector<Integer>(3,2);
System.out.println("向量中的元素个数为:"+v.size());
System.out.println("向量的容量为:"+v.capacity());
v.addElement(1);
v.addElement(2);
v.addElement(3);
v.addElement(4);
System.out.println("加入四个元素后容量为:"+v.capacity());
v.addElement(5);
System.out.println("当前向量的容量为:"+v.capacity());
v.addElement(6);
v.addElement(7);
v.addElement(8);
System.out.println("当前向量的容量为:"+v.capacity());
System.out.println("第一个元素为:"+v.firstElement());
System.out.println("最后一个元素为:"+v.lastElement());
if(v.contains(3)){
System.out.println("向量中包含 3");
}
System.out.println("\n 向量中的元素为:");
for(int i=0;i<v.size();i++){
System.out.print(v.get(i)+" ");
}
}
}
运行结果:
向量中的元素个数为:0
向量的容量为:3
加入四个元素后容量为:5
当前向量的容量为:5
当前向量的容量为:9
第一个元素为:1
最后一个元素为:8
向量中包含 3
向量中的元素为:
1 2 3 4 5 6 7 8
向量的遍历除了可以使用 get 方法循环访问向量的所有元素外,还可以使用 iterator(),返回一个可以遍历的元素列表,然后通过 hasNext()和 next()方法实现遍历,例如:
Iterator a=v.iterator();
while(v.hasNext()){
System.out.println(a.next());
}