基本操作示例
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
|
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
|
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
修饰。
希望本篇vector类使用示例文章对您有所帮助
原文链接:http://www.2cto.com/kf/201605/511067.html
相关文章
猜你喜欢
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-27 83
-
2025-06-04 58
-
2025-05-25 73
-
2025-05-25 27
-
2025-05-29 39
热门评论