Java中的vector类使用示例小结

Java中的vector类使用示例小结

转载  2016-05-11   作者:yyl8781697    我要评论

Vector与ArrayList的实现基本相似,同样是基于动态数组,同样是需要扩容,下面举了三个简短的例子来帮助大家理解vertor:

基本操作示例

VectorApp.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.Vector;
import java.lang.*;
import java.util.Enumeration;
public class VectorApp
{
   public static void main(String args[])
   {
    Vector v1 = new Vector();
    Integer integer1= new Integer( 1 );
    //加入为字符串对象
    v1.addElement( "one" );
    //加入的为integer的对象
    v1.addElement(integer1);
    v1.addElement(integer1);
    v1.addElement( "two" );
    v1.addElement( new Integer( 2 ));
    v1.addElement(integer1);
    v1.addElement(integer1);
    //转为字符串并打印
    System.out.println( "The Vector v1 is:\n\t" +v1);
    //向指定位置插入新对象
    v1.insertElement( "three" , 2 );
    v1.insertElement( new Float( 3.9 ), 3 );
    System.out.println("The Vector v1(used method
    insertElementAt()is:\n\t)"+v1);
    //将指定位置的对象设置为新的对象
    //指定位置后的对象依次往后顺延
    v1.setElementAt( "four" , 2 );
    System.out.println( "The vector v1 cused method setElmentAt()is:\n\t" +v1);
    v1.removeElement(integer1);
    //从向量对象v1中删除对象integer1
    //由于存在多个integer1,所以从头开始。
     //找删除找到的第一个integer1.
    Enumeration enum = v1.elements();
    System.out.println( "The vector v1 (used method removeElememt()is" );
    while ( enum .hasMoreElements())
    System.out.println( enum .nextElement()+ "" );
    System.out.println();
    //使用枚举类(Enumeration)的方法取得向量对象的每个元素。
     System.out.println( "The position of Object1(top-to-botton):" +v1.indexOf(integer1));
    System.out.println( "The position of Object1(tottom-to-top):" +v1.lastIndexOf(integer1));
    //按不同的方向查找对象integer1所处的位置
     v1.setSize( 4 );
    System.out.println( "The new Vector(resized the vector)is:" +v1);
    //重新设置v1的大小,多余的元素被抛弃 
   }
}

运行结果: 

?
1
2
3
4
5
6
7
8
9
10
11
12
E:\java01>java VectorApp
The vector v1 is:[one,1,1,two,2,1,1]
The vector v1(used method insetElementAt()) is:
[one,1,three,3.9,1,two,2,1,1]
The vector v1(used method setElementAt()) is:
[one,1,four,3.9,1,two,2,1,1]
The vector v1(useed method removeElement()) is:
one four 3.9 1 two 2 1 1
The position of object1(top-to-botton):3
The position of object1(botton-to-top):7
The new Vector(resized the vector) is:
[one,four,3.9,1]


Vertor的1倍扩容
还记得ArrayList每次扩容为元数组的0.5倍不?Vector在进行扩容操作时与ArrayList略微不同

?
1
2
3
4
5
6
7
8
9
10
11
12
13
protected int capacityIncrement; //用于指定每次扩容的容量
 
private void grow( int minCapacity) {
  // overflow-conscious code
  int oldCapacity = elementData.length;
  int newCapacity = 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类是线程安全的!
但是即使它所有的方法都被修饰成同步,也不意味着调用它的时候永远都不需要同步手段了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private static Vector<Integer> vector= new Vector<Integer>();
public static void main(String[] args) {
  while ( true )
  {
  for ( int i= 0 ;i< 10 ;i++)
  {
  vector.add(i);
  }
  
  Thread removeThread= new Thread( new Runnable(){
  @Override
  public void run()
  {
  for ( int i= 0 ;i<vector.size();i++)
  {
   vector.remove(i);
  }
  }
  });
  
  Thread printThread= new Thread( new Runnable(){
  @Override
  public void run()
  {
  for ( int i= 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修饰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值