Java中的vector类使用示例小结

 更新时间:2016年05月11日 17:08:26   作者:yyl8781697  
Vector与ArrayList的实现基本相似,同样是基于动态数组,同样是需要扩容,下面举了三个简短的例子来帮助大家理解vertor:

基本操作示例

VectorApp.java

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的大小,多余的元素被抛弃  
  } 
} 

运行结果:

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略微不同

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类是线程安全的!
但是即使它所有的方法都被修饰成同步,也不意味着调用它的时候永远都不需要同步手段了:

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修饰。

相关文章

  • 详谈java命令的本质逻辑揭秘

    详谈java命令的本质逻辑揭秘

    一个简单的java命令背后究竟做了些什么事情,很多朋友提出几个问题,下面带领大家一起学习Java命令的本质逻辑问题,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • springboot中手动提交事务的实现方法

    springboot中手动提交事务的实现方法

    手动提交事务可以提供更灵活的控制,以便在分布式环境中处理事务的提交和回滚,本文就来介绍一下springboot中手动提交事务的实现方法,感兴趣的可以了解一下
    2024-01-01
  • Java中的常用时间日期类总结(Date、DateFormat)

    Java中的常用时间日期类总结(Date、DateFormat)

    在Java开发中处理时间和日期是相当常见的任务,无论是计算日期差异、格式化日期显示、解析日期字符串还是进行日期计算,都需要一些时间和日期处理的技巧,这篇文章主要给大家介绍了关于Java中常用时间日期类(Date、DateFormat)的相关资料,需要的朋友可以参考下
    2024-08-08
  • Java中的值传递以及引用传递和数组传递详解

    Java中的值传递以及引用传递和数组传递详解

    这篇文章主要介绍了Java中的值传递以及引用传递和数组传递详解,Java不允许程序员选择按值传递还是按引用传递各个参数,就对象而言,不是将对象本身传递给方法,而是将对象的的引用或者说对象的首地址传递给方法,引用本身是按值传递的,需要的朋友可以参考下
    2023-07-07
  • springboot部署linux访问服务器资源的方法

    springboot部署linux访问服务器资源的方法

    这篇文章主要介绍了springboot部署linux访问服务器资源,部署springboot项目至服务器用了几种不同方法,文中给大家详细介绍,需要的朋友可以参考下
    2019-12-12
  • SpringBoot 实现动态添加定时任务功能

    SpringBoot 实现动态添加定时任务功能

    这篇文章主要介绍了SpringBoot 动态添加定时任务,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Java 8中 Stream小知识小技巧方法梳理

    Java 8中 Stream小知识小技巧方法梳理

    这篇文章主要介绍了Java8中Stream小知识小技巧方法梳理,Stream流和迭代器一样,它只能够迭代一次。当它遍历完的时候,我们就称它已经消费完了。如果还想重新执行操作,那么就只能从原来的地方再获取一个流
    2022-09-09
  • Java使用DateTimeFormatter实现格式化时间

    Java使用DateTimeFormatter实现格式化时间

    这篇文章主要介绍了Java使用DateTimeFormatter实现格式化时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • SpringBoot项目的logback日志配置(包括打印mybatis的sql语句)

    SpringBoot项目的logback日志配置(包括打印mybatis的sql语句)

    这篇文章主要介绍了SpringBoot项目的logback日志配置(包括打印mybatis的sql语句),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 如何解决Maven打包时每次都出现Download maven-metadata.xml卡住问题

    如何解决Maven打包时每次都出现Download maven-metadata.xml卡住问题

    这篇文章主要介绍了如何解决Maven打包时每次都出现Download maven-metadata.xml卡住问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论