网站首页 > 资源文章 正文
Vector介绍
Vector 是矢量队列,它是JDK1.0版本添加的类。继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。
Vector 继承了AbstractList,实现了List,所以,它是一个队列,支持相关的添加、删除、修改、遍历等功能。
Vector 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在Vector中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
Vector 实现了Cloneable接口,即实现clone()函数。它能被克隆。
和ArrayList不同,Vector中的操作是线程安全的。
Vector与Collection关系如下图:
Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData,elementCount,capacityIncrement。
(01) elementData 是"Object[]类型的数组",它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的>大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长,capacityIncrement是与容量增长相关的增长系数,具体的增长方式,请参考源码分析中的ensureCapacity()函数。
(02) elementCount 是动态数组的实际大小。
(03) capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时>,增加的大小都是capacityIncrement。
总结:
(01) Vector实际上是通过一个数组去保存数据的。当我们构造Vecotr时;若使用默认构造函数,则Vector的默认容量大小是10。
(02) 当Vector容量不足以容纳全部元素时,Vector的容量会增加。若容量增加系数 >0,则将容量的值增加“容量增加系数”;否则,将容量大小增加一倍。
(03) Vector的克隆函数,即是将全部元素克隆到一个数组中。
Vector遍历方式
Vector支持4种遍历方式。建议使用下面的第二种去遍历Vector,因为效率问题。
(01) 第一种,通过迭代器遍历。即通过Iterator去遍历。
Integer value = null;
int size = vec.size();
for (int i=0; i<size; i++) {
value = (Integer)vec.get(i);
}
(02) 第二种,随机访问,通过索引值去遍历。
由于Vector实现了RandomAccess接口,它支持通过索引值去随机访问元素。
Integer value = null;
int size = vec.size();
for (int i=0; i<size; i++) {
value = (Integer)vec.get(i);
}
(03) 第三种,另一种for循环。如下:
Integer value = null;
for (Integer integ:vec) {
value = integ;
}
(04) 第四种,Enumeration遍历。如下:
Integer value = null;
Enumeration enu = vec.elements();
while (enu.hasMoreElements()) {
value = (Integer)enu.nextElement();
}
测试这些遍历方式效率的代码如下:
package lxh.demo.listdemo; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Vector; /* * Vector遍历方式和效率的测试程序 */ public class VectorRandomAccessTest { public static void main(String[] args) { Vector vec = new Vector(); for(int i = 0; i < 100000; i++) { vec.add(i); } iteratorThroughRandomAccess(vec); iteratorThroughIterator(vec); iteratorThroughFor2(vec); iteratorThroughEnumeration(vec); } /* * 随机访问,通过索引值去遍历 */ public static void iteratorThroughRandomAccess(List list) { long startTime = System.currentTimeMillis(); for(int i = 0; i < list.size(); i++) { list.get(i); } long endTime = System.currentTimeMillis(); System.out.println("iteratorThroughRandomAccess: " + (endTime-startTime) + "ms"); } /* * 通过迭代器遍历 */ public static void iteratorThroughIterator(List list) { long startTime = System.currentTimeMillis(); for(Iterator iter = list.iterator(); iter.hasNext();) { iter.next(); } long endTime = System.currentTimeMillis(); System.out.println("iteratorThroughIterator: " + (endTime-startTime) + "ms"); } /* * 增强for循环 */ public static void iteratorThroughFor2(List list) { long startTime = System.currentTimeMillis(); for(Object ojb : list) { ; } long endTime = System.currentTimeMillis(); System.out.println("iteratorThroughFor2: " + (endTime-startTime) + "ms"); } /* * Enumeration遍历 */ public static void iteratorThroughEnumeration(Vector vec) { long startTime = System.currentTimeMillis(); for(Enumeration enu = vec.elements(); enu.hasMoreElements();) { enu.nextElement(); } long endTime = System.currentTimeMillis(); System.out.println("iteratorThroughEnumeration: " + (endTime-startTime) + "ms"); } } |
iteratorThroughRandomAccess: 5ms iteratorThroughIterator: 6ms iteratorThroughFor2: 4ms iteratorThroughEnumeration: 5ms |
Vector示例
本文通过一个实例(VectorTest.java),介绍 Vector 中常用API的用法。
package lxh.demo.listdemotest; import java.util.Enumeration; import java.util.Vector; /* * Vector测试函数 */ public class VectorTest01 { public static void main(String[] args) { //新建Vector Vector vec = new Vector(); //添加元素 vec.add("1"); vec.add("2"); vec.add("3"); vec.add("4"); vec.add("5"); //设置第一个元素为100 vec.set(0, "100"); //将500插入到第3个位置 vec.add(2, "500"); //将500插入到第4个位置 vec.add(2, "500"); System.out.println("vec: " + vec); //第一次出现的索引 System.out.println("vec.indexOf(100): " + vec.indexOf("500")); //最后一次出现的索引 System.out.println("vec.lastIndexOf(500): " + vec.lastIndexOf("500")); //获得第一个元素 System.out.println("vec.firstElement(): " + vec.firstElement()); //获得第三个元素 System.out.println("vec.elementAt(2): " + vec.elementAt(2)); //获得最后一个元素 System.out.println("vec.lastElement(): " + vec.lastElement()); //获取Vector的大小 System.out.println("size: " + vec.size()); //获得Vector的总的容量 System.out.println("capacity: " + vec.capacity()); //获取Vector的第二到第四个元素 System.out.println("vec 2 to 4: " + vec.subList(1, 4)); //通过Enumeration遍历Vector Enumeration enu = vec.elements(); while(enu.hasMoreElements()) { System.out.println("nextElement(): " + enu.nextElement()); } Vector retainVec = new Vector(); retainVec.add("100"); retainVec.add("300"); //获取vec中包含在retainVec中的元素的集合 System.out.println("vec.retain(): " + vec.retainAll(retainVec)); System.out.println("vec: " + vec); //获取vec对应的String数组 String[] arr = (String[]) vec.toArray(new String[0]); for(String str:arr) { System.out.println("str: " +str); } //清空Vector vec.clear(); //判断Vector是否为空 System.out.println("vec.isEmpty(): " + vec.isEmpty()); } } |
vec: [100, 2, 500, 500, 3, 4, 5] vec.indexOf(100): 2 vec.lastIndexOf(500): 3 vec.firstElement(): 100 vec.elementAt(2): 500 vec.lastElement(): 5 size: 7 capacity: 10 vec 2 to 4: [2, 500, 500] nextElement(): 100 nextElement(): 2 nextElement(): 500 nextElement(): 500 nextElement(): 3 nextElement(): 4 nextElement(): 5 vec.retain(): true vec: [100] str: 100 vec.isEmpty(): true |
猜你喜欢
- 2024-10-29 C++遍历vector元素的四种方式(c++ iterator遍历)
- 2024-10-29 c++vector常用操作及函数(c++ vector常用方法)
- 2024-10-29 Vector冲锋枪:极富科技感的未来军械
- 2024-10-29 绝地求生:汤姆逊或超越M4成玩家最爱?Vector居然加入空投了!
- 2024-10-29 绝地求生Vector(当对面掏出短剑的时候,你已经凉了)
- 2024-10-29 std::vector的用法,删除,添加,更新成员?
- 2024-10-29 C++ Vector类型及使用(c++vector详解)
- 2024-10-29 数据安排与操作方式:vector的扩容操作
- 2024-10-29 C++中的动态内存管理:深入探讨std::vector与指针
- 2024-10-29 vector的底层是如何实现的?#代码(vector的原理)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)