转自:http://senanlin.spaces.live.com/blog/cns!65313DCB90FB2494!114.entry?_c=BlogPart
Vector的用法
。。。。。。。。。。。。Vector是java.util包的类,他的功能是实现了一个动态增长的数组,像其他数组一样,此向量数组可以为每个包含的元素分配一下整数索引号,但是,向量不同于数组,它的长度可以在创建以后根据实际包含的元素个数增加或减少。
向量对象是通过capacity(容量)和capacityIncrement(增长幅度)两个因素来实现存储优化管理。容量因素的值总是大于向量的长度,因为当元素被添加到向量中,向量存储长度的增加是以增长幅度因素指定的值来增加的,应用程序可以在插入大量元素前,先根据需要增加适量的向量容量,这样,可以避免增加多余的存储空间。
以上是参考手册里对Vector的介绍,下面是我学习中的一些心得:
Vector有三个构造函数
public Vector(int initialCapacity,int capacityIncrement)
public Vector(int initialCapacity)
public Vector()
这三个构造函数的差别仅仅在于对向量的初始容量和增长幅度的定义上,向量的增长过程是当当前容易不能满足添加的元素时,就按照构造时给定的增长幅度来增加,如果未定义增长幅度,则每次增加的时候会成倍增加。举个例。
Vector t=new Vetor(4,0);
for(int i=0;i<20;i++)
t.addElement(new String("ft"));
那么实际运行后,t的容量是4*2*2*2=32,
如果改写成
Vector t=new Vetor(4,3);
for(int i=0;i<20;i++)
t.addElement(new String("ft"));
那么实际运行后,t的容量是4+3+3+3+3+3+3=22,
但如果写成
Vector t=new Vetor();
for(int i=0;i<20;i++)
t.addElement(new String("ft"));
则运行后t的容量是20,我测试过,好像用默认的构造函数,初始容量是10,以后每次翻倍,这样容易造成空间的浪费,因为建议不采用这种构造函数。
Vector类有很多方法,其实像常用的有addElement(),removeElementAt(int index),insertElementAt(Object obj,int index)等方法,这些方法从字面上就很容易理解,其实与数组的操作差不多。
Vector类的要点就在于对存储空间的操作,因为主要是讲一下下面的几个方法:
public void trimToSize()
该方法用于删除掉向量中大于向量当前长度的多余容量,应用程序通过使用此方法可以使向量容量刚好满足元素存储的最小需要。
public void ensureCapacity(int minCapacity)
该方法用于增加向量的容量,保证增加后的向量容量不小于给定的参数。对这个方法我作过测试,使用这个方法后向量容量增加的幅度与构造Vector类时的构造方法有关,如果构造函数时给定的向量增加幅度为0,那么使用这个方法后容量会成倍增长,如果构造函数时给定了不为0的向量增加幅度,那么使用这个方法后容量会以给定的幅度为单位增长。
public void setSize(int newSize)
该方法用于设置向量的长度,如果新设置的长度大于向量的当前长度,新增的内容为空的元素被添加到当前向量的尾部。如果新设置的长度小于向量当前的长度,索引值大于新设置长度的元素将被截取。
Vector实际上就是一种特殊的数组,由于他的通用性,他的元素都是Object类,所以对Vector的元素增加或者读取都要进行类型转换。如:
Vector t=new Vector();
t.addElement(new String("vector"));
system.out.println((String)t.elementAt(0));
t.addElement((Image)(pic));
g.drawImage((Image)(t.elementAt(1)),0,0,0);
ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些
import java.util.*;
/**
* 演示Vector的使用。包括Vector的创建、向Vector中添加元素、从Vector中删除元素、
* 统计Vector中元素的个数和遍历Vector中的元素。
*/
public class VectorDemo{
public static void main(String[] args){
//Vector的创建
//使用Vector的构造方法进行创建
Vector v = new Vector(4);
//向Vector中添加元素
//使用add方法直接添加元素
v.add("Test0");
v.add("Test1");
v.add("Test0");
v.add("Test2");
v.add("Test2");
//从Vector中删除元素
v.remove("Test0"); //删除指定内容的元素
v.remove(0); //按照索引号删除元素
//获得Vector中已有元素的个数
int size = v.size();
System.out.println("size:" + size);
//遍历Vector中的元素
for(int i = 0;i < v.size();i++){
System.out.println(v.get(i));
}
}
}
-------------
Vector 类提供了实现可增长数组的功能,随着更多元素加入其中,数组变的更大。在删除一些元素之后,数组变小。
Vector 有三个构造函数,
public Vector(int initialCapacity,int capacityIncrement)
public Vector(int initialCapacity)
public Vector()
Vector 运行时创建一个初始的存储容量initialCapacity,存储容量是以capacityIncrement 变量定义的增量增长。初始的存储容量和capacityIncrement 可以在Vector 的构造函数中定义。第二个构造函数只创建初始存储容量。第三个构造函数既不指定初始的存储容量也不指定capacityIncrement。
Vector 类提供的访问方法支持类似数组运算和与Vector 大小相关的运算。类似数组的运算允许向量中增加,删除和插入元素。它们也允许测试矢量的内容和检索指定的元素,与大小相关的运算允许判定字节大小和矢量中元素不数目。
现针对经常用到的对向量增,删,插功能举例描述:
addElement(Object obj)
把组件加到向量尾部,同时大小加1,向量容量比以前大1
insertElementAt(Object obj, int index)
把组件加到所定索引处,此后的内容向后移动1 个单位
setElementAt(Object obj, int index)
把组件加到所定索引处,此处的内容被代替。
removeElement(Object obj) 把向量中含有本组件内容移走。
removeAllElements() 把向量中所有组件移走,向量大小为0。
例如:
import java.lang.System;
import java.util.Vector;
import java.util.Emumeration;
public class Avector{
public static void main(String args[])
{
0. Vector v=new Vector();
1. v.addElement("one");
2. addElement("two");
3. v.addElement("three");
4. v.insertElementAt("zero",0);
5. v.insertElementAt("oop",3);
6. v.setElementAt("three",3);
7. v.setElementAt("four",4);
8. v.removeAllElements();
}
}
Vector中的变化情况:
1. one 2. one 3. one 4. zero 5.zero 6. zero 7. zero 8.
two two one one one one
three two two two two
three oop three three
three three four
另外,Vector 在参数传递中发挥着举足轻重的作用。
在Applet 中有一块画布(Canvas) 和一个(Panel), 而Panel 中放着用户要输入的信息,根据这些信息把参数传递到canvas 中,这时在Java 中用一个接口(Interface), 而在接口中需用一个Vector 去传递这些参数。另外,在一个类向另一个类参数传递就可以用这种方法。
例如:
import java.util.Vector
interface codeselect{
Vector codeselect=new Vector();
}
显示数学信息
Vector(0)存入学生编号
Vector(1)存入学科
在Panel 中当用户在TextField 和Choice 中选择自己所要求的内容,程序中
通过事件响应把值传到向量Vector 中。
假若在Panel 类中:
public void codepanel extends Panel{
public void init()
{
**.
TextField s=new TextField();
Choice c=new Choice();
c. addItem("语文");
c.addItem("数学");
c.addItem("政治");
add(s);
add (c);
**
}
public boolean handleEvent(Event event){
if(event.id==Event.ACTION_EVENT){
if(event.target.instanceof Textfield)
{
coderesult.setElementAt(s.getText(),0);
}
else if(event.target intanceof Choice)
{
coderesult.setElementAt(new Integer(c.getSelectedIndex()),1);
}
}
}
}
这时,向量中已经存入学生编号和学科索引号(0 为语文,1 为数学,2 为政治)。
而在Canvas 中得到此值,
public class codecanvas extends Canvas{
public void code{
}
public void paint{
String str;
int t;
str=(String)coderesult.elementAt(0);
t=(new Integer(codeselect.elementAt(1).toString())).intValue();
if(t==0)
{
显示语文信息
}
else if(t==1)
{
显示数学信息
}
else if(t==2)
{
显示政治信息
}
}
}