Java中的vector类使用示例小结
基本操作示例
VectorApp.java
importjava.util.Vector;
importjava.lang.*;
importjava.util.Enumeration;
publicclassVectorApp
{
publicstaticvoidmain(Stringargs[])
{
Vectorv1=newVector();
Integerinteger1=newInteger(1);
//加入为字符串对象
v1.addElement("one");
//加入的为integer的对象
v1.addElement(integer1);
v1.addElement(integer1);
v1.addElement("two");
v1.addElement(newInteger(2));
v1.addElement(integer1);
v1.addElement(integer1);
//转为字符串并打印
System.out.println("TheVectorv1is:\n\t"+v1);
//向指定位置插入新对象
v1.insertElement("three",2);
v1.insertElement(newFloat(3.9),3);
System.out.println("TheVectorv1(usedmethod
insertElementAt()is:\n\t)"+v1);
//将指定位置的对象设置为新的对象
//指定位置后的对象依次往后顺延
v1.setElementAt("four",2);
System.out.println("Thevectorv1cusedmethodsetElmentAt()is:\n\t"+v1);
v1.removeElement(integer1);
//从向量对象v1中删除对象integer1
//由于存在多个integer1,所以从头开始。
//找删除找到的第一个integer1.
Enumerationenum=v1.elements();
System.out.println("Thevectorv1(usedmethodremoveElememt()is");
while(enum.hasMoreElements())
System.out.println(enum.nextElement()+"");
System.out.println();
//使用枚举类(Enumeration)的方法取得向量对象的每个元素。
System.out.println("ThepositionofObject1(top-to-botton):"+v1.indexOf(integer1));
System.out.println("ThepositionofObject1(tottom-to-top):"+v1.lastIndexOf(integer1));
//按不同的方向查找对象integer1所处的位置
v1.setSize(4);
System.out.println("ThenewVector(resizedthevector)is:"+v1);
//重新设置v1的大小,多余的元素被抛弃
}
}
运行结果:
E:\java01>javaVectorApp Thevectorv1is:[one,1,1,two,2,1,1] Thevectorv1(usedmethodinsetElementAt())is: [one,1,three,3.9,1,two,2,1,1] Thevectorv1(usedmethodsetElementAt())is: [one,1,four,3.9,1,two,2,1,1] Thevectorv1(useedmethodremoveElement())is: onefour3.91two211 Thepositionofobject1(top-to-botton):3 Thepositionofobject1(botton-to-top):7 ThenewVector(resizedthevector)is: [one,four,3.9,1]
Vertor的1倍扩容
还记得ArrayList每次扩容为元数组的0.5倍不?Vector在进行扩容操作时与ArrayList略微不同
protectedintcapacityIncrement;//用于指定每次扩容的容量
privatevoidgrow(intminCapacity){
//overflow-consciouscode
intoldCapacity=elementData.length;
intnewCapacity=oldCapacity+((capacityIncrement>0)?
capacityIncrement:oldCapacity);//如不指定capacityIncrement,默认扩容的容量为原数组的容量
if(newCapacity-minCapacity<0)
newCapacity=minCapacity;
if(newCapacity-MAX_ARRAY_SIZE>0)
newCapacity=hugeCapacity(minCapacity);
elementData=Arrays.copyOf(elementData,newCapacity);
}
细心的小伙伴可以发现Vector中多了一个capacityIncrement变量,该变量是用于指定每次扩容的增量,如果不指定该变量,在grow中可以发现Vector默认就扩容为原数组的1倍
线程安全
Vertor是线程安全的!
Vertor源码中另一个比较显眼的地方就是绝大部分方法都有synchronized关键字,大家都知道这个关键字是用于线程同步的,所以Vector类是线程安全的!
但是即使它所有的方法都被修饰成同步,也不意味着调用它的时候永远都不需要同步手段了:
privatestaticVector<Integer>vector=newVector<Integer>();
publicstaticvoidmain(String[]args){
while(true)
{
for(inti=0;i<10;i++)
{
vector.add(i);
}
ThreadremoveThread=newThread(newRunnable(){
@Override
publicvoidrun()
{
for(inti=0;i<vector.size();i++)
{
vector.remove(i);
}
}
});
ThreadprintThread=newThread(newRunnable(){
@Override
publicvoidrun()
{
for(inti=0;i<vector.size();i++)
{
System.out.println(vector.get(i));
}
}
});
removeThread.start();
printThread.start();
while(Thread.activeCount()>20);
}
}
大家运行此段代码时跑了一小段时间之后会发现有ArrayIndexOutOfBoundsException异常,这里Vector的get,remove,size方法尽管有synchronized修饰,但是在多线程环境中,如果不在方法端额外做同步措施的话,这段代码仍然是不安全的,如果一个线程删除了序号i的元素之后,另一个线程去访问这个i的话就直接回抛异常,所以保证这段代码安全还需要再run里面再添加synchronized修饰。