Java中的vector类使用示例小结

作者:yyl8781697 时间:2023-09-01 02:46:59 

基本操作示例

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,vector
0
投稿

猜你喜欢

  • 浅谈对c# 面向对象的理解

    2021-06-18 18:15:52
  • C#数据结构之双向链表(DbLinkList)实例详解

    2023-08-23 08:56:44
  • SpringMVC域对象共享数据示例详解

    2023-03-10 22:21:21
  • java设计模式之工厂模式实例详解

    2023-11-24 23:35:12
  • springcloud项目占用内存好几个G导致服务器崩溃的问题

    2023-03-30 09:54:25
  • Android滑动组件悬浮固定在顶部效果

    2022-12-13 19:24:32
  • unity使用socket编程实现聊天室功能

    2023-10-18 05:26:04
  • java Iterator接口和LIstIterator接口分析

    2023-05-23 21:31:24
  • 带你一文了解C#中的Expression

    2023-04-20 04:37:57
  • java简单实现斗地主发牌功能

    2023-06-18 16:22:44
  • java二叉树的几种遍历递归与非递归实现代码

    2022-06-29 19:19:47
  • 深入探讨Java多线程中的volatile变量

    2023-08-31 02:32:18
  • C#实现百度ping推送功能的方法

    2023-03-01 18:15:56
  • C#文件和字节流的转换方法

    2022-03-18 05:39:43
  • Android O添加桌面快捷方式的示例

    2022-12-27 07:53:19
  • idea如何配置javafxsdk详细教程

    2023-11-24 22:04:16
  • C#实现字符串进制转换方法汇总

    2022-01-03 09:30:37
  • Android Studio 中获取屏幕宽度实例

    2022-03-25 11:55:36
  • vscode使用官方C/C++插件无法进行代码格式化问题

    2022-07-13 06:24:47
  • C#实现简单的Login窗口实例

    2021-07-18 02:23:29
  • asp之家 软件编程 m.aspxhome.com