Vector简介

  1. public class Vector<E>
  2. extends AbstractList<E>
  3. implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  4. {
  5. }
  • Vector 它是JDK1.0版本添加的类。继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。
  • Vector 继承了AbstractList,实现了List;所以,它是一个队列,支持相关的添加、删除、修改、遍历等功能
  • Vector 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在Vector中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
  • Vector 实现了Cloneable接口,即实现clone()函数。它能被克隆。
  • Vector的方法上都加了synchronized, 和ArrayList不同,Vector中的操作是线程安全的

Vector详解 - 图1

Vector的构造函数

Vector共有4个构造函数

  1. // 默认构造函数
  2. Vector()
  3. // capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。
  4. Vector(int capacity)
  5. // capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
  6. Vector(int capacity, int capacityIncrement)
  7. // 创建一个包含collection的Vector
  8. Vector(Collection<? extends E> collection)

Vector的数据结构

Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData , elementCount, capacityIncrement。

  • elementData 是”Object[]类型的数组”,它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长,capacityIncrement是与容量增长相关的增长系数,具体的增长方式,请参考源码分析中的ensureCapacity()函数。
  • elementCount 是动态数组的实际大小。
  • capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时,增加的大小都是capacityIncrement。

vector源码解析

  1. package java.util;
  2. public class Vector<E>
  3. extends AbstractList<E>
  4. implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  5. {
  6. // 保存Vector中数据的数组
  7. protected Object[] elementData;
  8. // 实际数据的数量
  9. protected int elementCount;
  10. // 容量增长系数
  11. protected int capacityIncrement;
  12. // Vector的序列版本号
  13. private static final long serialVersionUID = -2767605614048989439L;
  14. // Vector构造函数。默认容量是10。
  15. public Vector() {
  16. this(10);
  17. }
  18. // 指定Vector容量大小的构造函数
  19. public Vector(int initialCapacity) {
  20. this(initialCapacity, 0);
  21. }
  22. // 指定Vector"容量大小"和"增长系数"的构造函数
  23. public Vector(int initialCapacity, int capacityIncrement) {
  24. super();
  25. if (initialCapacity < 0)
  26. throw new IllegalArgumentException("Illegal Capacity: "+
  27. initialCapacity);
  28. // 新建一个数组,数组容量是initialCapacity
  29. this.elementData = new Object[initialCapacity];
  30. // 设置容量增长系数
  31. this.capacityIncrement = capacityIncrement;
  32. }
  33. // 指定集合的Vector构造函数。
  34. public Vector(Collection<? extends E> c) {
  35. // 获取“集合(c)”的数组,并将其赋值给elementData
  36. elementData = c.toArray();
  37. // 设置数组长度
  38. elementCount = elementData.length;
  39. // c.toArray might (incorrectly) not return Object[] (see 6260652)
  40. //传入的集合可能不是Object的,就拷贝放入Object数组中Object[].class
  41. if (elementData.getClass() != Object[].class)
  42. elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
  43. }
  44. // 将数组Vector的全部元素都拷贝到数组anArray中
  45. public synchronized void copyInto(Object[] anArray) {
  46. System.arraycopy(elementData, 0, anArray, 0, elementCount);
  47. }
  48. /*
  49. 第一个参数: 源数组
  50. 第二个参数: 源数组开始拷贝的位置
  51. 第三个参数: 目标数组
  52. 第四个参数: 目标数据存放拷贝来的元素的开始位置
  53. 第五个参数: 被拷贝的元素数量
  54. public static native void arraycopy(Object src, int srcPos,
  55. Object dest, int destPos,
  56. int length);
  57. */
  58. // 将当前容量值设为 =实际元素个数
  59. public synchronized void trimToSize() {
  60. modCount++;
  61. int oldCapacity = elementData.length;
  62. if (elementCount < oldCapacity) {
  63. elementData = Arrays.copyOf(elementData, elementCount);
  64. }
  65. }
  66. // 确认“Vector容量”的帮助函数
  67. private void ensureCapacityHelper(int minCapacity) {
  68. int oldCapacity = elementData.length;
  69. // 当Vector的容量不足以容纳当前的全部元素,增加容量大小。
  70. // 若 容量增量系数>0(即capacityIncrement>0),则将容量增大当capacityIncrement
  71. // 否则,将容量增大一倍。
  72. if (minCapacity > oldCapacity) {
  73. Object[] oldData = elementData;
  74. int newCapacity = (capacityIncrement > 0) ?
  75. (oldCapacity + capacityIncrement) : (oldCapacity * 2);
  76. if (newCapacity < minCapacity) {
  77. newCapacity = minCapacity;
  78. }
  79. elementData = Arrays.copyOf(elementData, newCapacity);
  80. }
  81. }
  82. // 确定Vector的容量。
  83. public synchronized void ensureCapacity(int minCapacity) {
  84. // 将Vector的改变统计数+1
  85. modCount++;
  86. ensureCapacityHelper(minCapacity);
  87. }
  88. // 设置容量值为 newSize
  89. public synchronized void setSize(int newSize) {
  90. modCount++;
  91. if (newSize > elementCount) {
  92. // 若 "newSize 大于 Vector容量",则调整Vector的大小。
  93. ensureCapacityHelper(newSize);
  94. } else {
  95. // 若 "newSize 小于/等于 Vector容量",则将newSize位置开始的元素都设置为null
  96. for (int i = newSize ; i < elementCount ; i++) {
  97. elementData[i] = null;
  98. }
  99. }
  100. elementCount = newSize;
  101. }
  102. // 返回“Vector的总的容量”
  103. public synchronized int capacity() {
  104. return elementData.length;
  105. }
  106. // 返回“Vector的实际大小”,即Vector中元素个数
  107. public synchronized int size() {
  108. return elementCount;
  109. }
  110. // 判断Vector是否为空
  111. public synchronized boolean isEmpty() {
  112. return elementCount == 0;
  113. }
  114. // 返回“Vector中全部元素对应的Enumeration”
  115. public Enumeration<E> elements() {
  116. // 通过匿名类实现Enumeration
  117. return new Enumeration<E>() {
  118. int count = 0;
  119. // 是否存在下一个元素
  120. public boolean hasMoreElements() {
  121. return count < elementCount;
  122. }
  123. // 获取下一个元素
  124. public E nextElement() {
  125. synchronized (Vector.this) {
  126. if (count < elementCount) {
  127. return (E)elementData[count++];
  128. }
  129. }
  130. throw new NoSuchElementException("Vector Enumeration");
  131. }
  132. };
  133. }
  134. // 返回Vector中是否包含对象(o)
  135. public boolean contains(Object o) {
  136. return indexOf(o, 0) >= 0;
  137. }
  138. // 从index位置开始向后查找元素(o)。
  139. // 若找到,则返回元素的索引值;否则,返回-1
  140. public synchronized int indexOf(Object o, int index) {
  141. if (o == null) {
  142. // 若查找元素为null,则正向找出null元素,并返回它对应的序号
  143. for (int i = index ; i < elementCount ; i++)
  144. if (elementData[i]==null)
  145. return i;
  146. } else {
  147. // 若查找元素不为null,则正向找出该元素,并返回它对应的序号
  148. for (int i = index ; i < elementCount ; i++)
  149. if (o.equals(elementData[i]))
  150. return i;
  151. }
  152. return -1;
  153. }
  154. // 查找并返回元素(o)在Vector中的索引值
  155. public int indexOf(Object o) {
  156. return indexOf(o, 0);
  157. }
  158. // 从后向前查找元素(o)。并返回元素的索引
  159. public synchronized int lastIndexOf(Object o) {
  160. return lastIndexOf(o, elementCount-1);
  161. }
  162. // 从后向前查找元素(o)。开始位置是从前向后的第index个数;
  163. // 若找到,则返回元素的“索引值”;否则,返回-1。
  164. public synchronized int lastIndexOf(Object o, int index) {
  165. if (index >= elementCount)
  166. throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
  167. if (o == null) {
  168. // 若查找元素为null,则反向找出null元素,并返回它对应的序号
  169. for (int i = index; i >= 0; i--)
  170. if (elementData[i]==null)
  171. return i;
  172. } else {
  173. // 若查找元素不为null,则反向找出该元素,并返回它对应的序号
  174. for (int i = index; i >= 0; i--)
  175. if (o.equals(elementData[i]))
  176. return i;
  177. }
  178. return -1;
  179. }
  180. // 返回Vector中index位置的元素。
  181. // 若index月结,则抛出异常
  182. public synchronized E elementAt(int index) {
  183. if (index >= elementCount) {
  184. throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
  185. }
  186. return (E)elementData[index];
  187. }
  188. // 获取Vector中的第一个元素。
  189. // 若失败,则抛出异常!
  190. public synchronized E firstElement() {
  191. if (elementCount == 0) {
  192. throw new NoSuchElementException();
  193. }
  194. return (E)elementData[0];
  195. }
  196. // 获取Vector中的最后一个元素。
  197. // 若失败,则抛出异常!
  198. public synchronized E lastElement() {
  199. if (elementCount == 0) {
  200. throw new NoSuchElementException();
  201. }
  202. return (E)elementData[elementCount - 1];
  203. }
  204. // 设置index位置的元素值为obj
  205. public synchronized void setElementAt(E obj, int index) {
  206. if (index >= elementCount) {
  207. throw new ArrayIndexOutOfBoundsException(index + " >= " +
  208. elementCount);
  209. }
  210. elementData[index] = obj;
  211. }
  212. // 删除index位置的元素
  213. public synchronized void removeElementAt(int index) {
  214. modCount++;
  215. if (index >= elementCount) {
  216. throw new ArrayIndexOutOfBoundsException(index + " >= " +
  217. elementCount);
  218. } else if (index < 0) {
  219. throw new ArrayIndexOutOfBoundsException(index);
  220. }
  221. int j = elementCount - index - 1;
  222. if (j > 0) {
  223. System.arraycopy(elementData, index + 1, elementData, index, j);
  224. }
  225. elementCount--;
  226. elementData[elementCount] = null; /* to let gc do its work */
  227. }
  228. // 在index位置处插入元素(obj)
  229. public synchronized void insertElementAt(E obj, int index) {
  230. modCount++;
  231. if (index > elementCount) {
  232. throw new ArrayIndexOutOfBoundsException(index
  233. + " > " + elementCount);
  234. }
  235. ensureCapacityHelper(elementCount + 1);
  236. System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
  237. elementData[index] = obj;
  238. elementCount++;
  239. }
  240. // 将“元素obj”添加到Vector末尾
  241. public synchronized void addElement(E obj) {
  242. modCount++; //记录操作次数
  243. ensureCapacityHelper(elementCount + 1); // 确认内部数组长度
  244. elementData[elementCount++] = obj;
  245. }
  246. // 在Vector中查找并删除元素obj。
  247. // 成功的话,返回true;否则,返回false。
  248. public synchronized boolean removeElement(Object obj) {
  249. modCount++;
  250. int i = indexOf(obj);
  251. if (i >= 0) {
  252. removeElementAt(i);
  253. return true;
  254. }
  255. return false;
  256. }
  257. // 删除Vector中的全部元素
  258. public synchronized void removeAllElements() {
  259. modCount++;
  260. // 将Vector中的全部元素设为null
  261. for (int i = 0; i < elementCount; i++)
  262. elementData[i] = null;
  263. elementCount = 0;
  264. }
  265. // 克隆函数
  266. public synchronized Object clone() {
  267. try {
  268. Vector<E> v = (Vector<E>) super.clone();
  269. // 将当前Vector的全部元素拷贝到v中
  270. v.elementData = Arrays.copyOf(elementData, elementCount);
  271. v.modCount = 0;
  272. return v;
  273. } catch (CloneNotSupportedException e) {
  274. // this shouldn't happen, since we are Cloneable
  275. throw new InternalError();
  276. }
  277. }
  278. // 返回Object数组
  279. public synchronized Object[] toArray() {
  280. return Arrays.copyOf(elementData, elementCount);
  281. }
  282. // 返回Vector的模板数组。所谓模板数组,即可以将T设为任意的数据类型
  283. public synchronized <T> T[] toArray(T[] a) {
  284. // 若数组a的大小 < Vector的元素个数;
  285. // 则新建一个T[]数组,数组大小是“Vector的元素个数”,并将“Vector”全部拷贝到新数组中
  286. if (a.length < elementCount)
  287. return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());
  288. // 若数组a的大小 >= Vector的元素个数;
  289. // 则将Vector的全部元素都拷贝到数组a中。
  290. System.arraycopy(elementData, 0, a, 0, elementCount);
  291. if (a.length > elementCount)
  292. a[elementCount] = null;
  293. return a;
  294. }
  295. // 获取index位置的元素
  296. public synchronized E get(int index) {
  297. if (index >= elementCount)
  298. throw new ArrayIndexOutOfBoundsException(index);
  299. return (E)elementData[index];
  300. }
  301. // 设置index位置的值为element。并返回index位置的原始值
  302. public synchronized E set(int index, E element) {
  303. if (index >= elementCount)
  304. throw new ArrayIndexOutOfBoundsException(index);
  305. Object oldValue = elementData[index];
  306. elementData[index] = element;
  307. return (E)oldValue;
  308. }
  309. // 将“元素e”添加到Vector最后。
  310. public synchronized boolean add(E e) {
  311. modCount++;
  312. ensureCapacityHelper(elementCount + 1);
  313. elementData[elementCount++] = e;
  314. return true;
  315. }
  316. // 删除Vector中的元素o
  317. public boolean remove(Object o) {
  318. return removeElement(o);
  319. }
  320. // 在index位置添加元素element
  321. public void add(int index, E element) {
  322. insertElementAt(element, index);
  323. }
  324. // 删除index位置的元素,并返回index位置的原始值
  325. public synchronized E remove(int index) {
  326. modCount++;
  327. if (index >= elementCount)
  328. throw new ArrayIndexOutOfBoundsException(index);
  329. Object oldValue = elementData[index];
  330. int numMoved = elementCount - index - 1;
  331. if (numMoved > 0)
  332. System.arraycopy(elementData, index+1, elementData, index,
  333. numMoved);
  334. elementData[--elementCount] = null; // Let gc do its work
  335. return (E)oldValue;
  336. }
  337. // 清空Vector
  338. public void clear() {
  339. removeAllElements();
  340. }
  341. // 返回Vector是否包含集合c
  342. public synchronized boolean containsAll(Collection<?> c) {
  343. return super.containsAll(c);
  344. }
  345. // 将集合c添加到Vector中
  346. public synchronized boolean addAll(Collection<? extends E> c) {
  347. modCount++;
  348. Object[] a = c.toArray();
  349. int numNew = a.length;
  350. ensureCapacityHelper(elementCount + numNew);
  351. // 将集合c的全部元素拷贝到数组elementData中
  352. System.arraycopy(a, 0, elementData, elementCount, numNew);
  353. elementCount += numNew;
  354. return numNew != 0;
  355. }
  356. // 删除集合c的全部元素
  357. public synchronized boolean removeAll(Collection<?> c) {
  358. return super.removeAll(c);
  359. }
  360. // 删除“非集合c中的元素”
  361. public synchronized boolean retainAll(Collection<?> c) {
  362. return super.retainAll(c);
  363. }
  364. // 从index位置开始,将集合c添加到Vector中
  365. public synchronized boolean addAll(int index, Collection<? extends E> c) {
  366. modCount++;
  367. if (index < 0 || index > elementCount)
  368. throw new ArrayIndexOutOfBoundsException(index);
  369. Object[] a = c.toArray();
  370. int numNew = a.length;
  371. ensureCapacityHelper(elementCount + numNew);
  372. int numMoved = elementCount - index;
  373. if (numMoved > 0)
  374. System.arraycopy(elementData, index, elementData, index + numNew, numMoved);
  375. System.arraycopy(a, 0, elementData, index, numNew);
  376. elementCount += numNew;
  377. return numNew != 0;
  378. }
  379. // 返回两个对象是否相等
  380. public synchronized boolean equals(Object o) {
  381. return super.equals(o);
  382. }
  383. // 计算哈希值
  384. public synchronized int hashCode() {
  385. return super.hashCode();
  386. }
  387. // 调用父类的toString()
  388. public synchronized String toString() {
  389. return super.toString();
  390. }
  391. // 获取Vector中fromIndex(包括)到toIndex(不包括)的子集
  392. public synchronized List<E> subList(int fromIndex, int toIndex) {
  393. return Collections.synchronizedList(super.subList(fromIndex, toIndex), this);
  394. }
  395. // 删除Vector中fromIndex到toIndex的元素
  396. protected synchronized void removeRange(int fromIndex, int toIndex) {
  397. modCount++;
  398. int numMoved = elementCount - toIndex;
  399. System.arraycopy(elementData, toIndex, elementData, fromIndex,
  400. numMoved);
  401. // Let gc do its work
  402. int newElementCount = elementCount - (toIndex-fromIndex);
  403. while (elementCount != newElementCount)
  404. elementData[--elementCount] = null;
  405. }
  406. // java.io.Serializable的写入函数
  407. private synchronized void writeObject(java.io.ObjectOutputStream s)
  408. throws java.io.IOException {
  409. s.defaultWriteObject();
  410. }
  411. }
  1. public synchronized boolean add(E e) {
  2. modCount++;
  3. ensureCapacityHelper(elementCount + 1); // 最小容量就是 原来的元素个数+新增的一个
  4. elementData[elementCount++] = e;
  5. return true;
  6. }
  7. private void ensureCapacityHelper(int minCapacity) {
  8. // 如果需要的最小容量比数组的长度大就扩容
  9. if (minCapacity - elementData.length > 0)
  10. grow(minCapacity);
  11. }
  12. private void grow(int minCapacity) {
  13. int oldCapacity = elementData.length; // 扩容前数组的长度
  14. // 如果capacityIncrement大于零就扩容capacityIncrement,否则扩容1倍
  15. int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
  16. // 如果扩容后还是空间不够,就把minCapacity作为扩容后的数组长度
  17. if (newCapacity - minCapacity < 0)
  18. newCapacity = minCapacity;
  19. // 判断扩容后的长度是不是超过了最大长度
  20. if (newCapacity - MAX_ARRAY_SIZE > 0)
  21. newCapacity = hugeCapacity(minCapacity);
  22. elementData = Arrays.copyOf(elementData, newCapacity);
  23. }
  24. /**
  25. * The maximum size of array to allocate.
  26. * Some VMs reserve some header words in an array.
  27. * Attempts to allocate larger arrays may result in
  28. * OutOfMemoryError: Requested array size exceeds VM limit
  29. */
  30. private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
  31. /* 最大值 2的31次方减1
  32. 最小值 2的31次方
  33. System.out.println(Integer.MAX_VALUE + 1); //-2147483648
  34. System.out.println(Integer.MIN_VALUE); //-2147483648
  35. */
  36. private static int hugeCapacity(int minCapacity) {
  37. if (minCapacity < 0) // overflow
  38. throw new OutOfMemoryError();
  39. return (minCapacity > MAX_ARRAY_SIZE) ?
  40. Integer.MAX_VALUE :
  41. MAX_ARRAY_SIZE;
  42. }
  1. // 删除index位置的元素
  2. public synchronized void removeElementAt(int index) {
  3. modCount++;
  4. if (index >= elementCount) {
  5. throw new ArrayIndexOutOfBoundsException(index + " >= " +
  6. elementCount);
  7. } else if (index < 0) {
  8. throw new ArrayIndexOutOfBoundsException(index);
  9. }
  10. int j = elementCount - index - 1;
  11. if (j > 0) {
  12. System.arraycopy(elementData, index + 1, elementData, index, j);
  13. }
  14. elementCount--;
  15. elementData[elementCount] = null; /* to let gc do its work */
  16. // 注意这里把最后一个元素赋值为null
  17. }

总结
(01) Vector实际上是通过一个数组去保存数据的。当我们构造Vecotr时;若使用默认构造函数,则Vector的默认容量大小是**10
(02) 当Vector容量不足以容纳全部元素时,Vector的容量会增加。
若容量增加系数 >0,则将容量的值增加“容量增加系数”;否则,将容量大小增加一倍。**
(03) Vector的克隆函数,即是将全部元素克隆到一个数组中。

vector遍历方式

Vector支持4种遍历方式。建议使用下面的第二种去遍历Vector,因为效率问题。
第一种,通过迭代器遍历。即通过Iterator去遍历。

  1. Integer value = null;
  2. Iterator<int> size = vec.iterator();
  3. while(size.hasNext()){
  4. value = size.next();
  5. }

(02) 第二种,随机访问,通过索引值去遍历。
由于Vector实现了RandomAccess接口,它支持通过索引值去随机访问元素。

  1. Integer value = null;
  2. int size = vec.size();
  3. for (int i=0; i<size; i++) {
  4. value = (Integer)vec.get(i);
  5. }

(03) 第三种,增强for循环。如下:

  1. Integer value = null;
  2. for (Integer integ:vec) {
  3. value = integ;
  4. }

(04) 第四种,Enumeration遍历。如下:

  1. Integer value = null;
  2. Enumeration enu = vec.elements();
  3. while (enu.hasMoreElements()) {
  4. value = (Integer)enu.nextElement();
  5. }

测试这些遍历方式效率的代码如下

  1. import java.util.*;
  2. /*
  3. * @desc Vector遍历方式和效率的测试程序。
  4. *
  5. * @author skywang
  6. */
  7. public class VectorRandomAccessTest {
  8. public static void main(String[] args) {
  9. Vector vec= new Vector();
  10. for (int i=0; i<100000; i++)
  11. vec.add(i);
  12. iteratorThroughRandomAccess(vec) ;
  13. iteratorThroughIterator(vec) ;
  14. iteratorThroughFor2(vec) ;
  15. iteratorThroughEnumeration(vec) ;
  16. }
  17. private static void isRandomAccessSupported(List list) {
  18. if (list instanceof RandomAccess) {
  19. System.out.println("RandomAccess implemented!");
  20. } else {
  21. System.out.println("RandomAccess not implemented!");
  22. }
  23. }
  24. public static void iteratorThroughRandomAccess(List list) {
  25. long startTime;
  26. long endTime;
  27. startTime = System.currentTimeMillis();
  28. for (int i=0; i<list.size(); i++) {
  29. list.get(i);
  30. }
  31. endTime = System.currentTimeMillis();
  32. long interval = endTime - startTime;
  33. System.out.println("iteratorThroughRandomAccess:" + interval+" ms");
  34. }
  35. public static void iteratorThroughIterator(List list) {
  36. long startTime;
  37. long endTime;
  38. startTime = System.currentTimeMillis();
  39. for(Iterator iter = list.iterator(); iter.hasNext(); ) {
  40. iter.next();
  41. }
  42. endTime = System.currentTimeMillis();
  43. long interval = endTime - startTime;
  44. System.out.println("iteratorThroughIterator:" + interval+" ms");
  45. }
  46. public static void iteratorThroughFor2(List list) {
  47. long startTime;
  48. long endTime;
  49. startTime = System.currentTimeMillis();
  50. for(Object obj:list)
  51. ;
  52. endTime = System.currentTimeMillis();
  53. long interval = endTime - startTime;
  54. System.out.println("iteratorThroughFor2:" + interval+" ms");
  55. }
  56. public static void iteratorThroughEnumeration(Vector vec) {
  57. long startTime;
  58. long endTime;
  59. startTime = System.currentTimeMillis();
  60. for(Enumeration enu = vec.elements(); enu.hasMoreElements(); ) {
  61. enu.nextElement();
  62. }
  63. endTime = System.currentTimeMillis();
  64. long interval = endTime - startTime;
  65. System.out.println("iteratorThroughEnumeration:" + interval+" ms");
  66. }
  67. }

总结:遍历Vector,使用索引的随机访问方式最快,使用迭代器最慢。

vector实例

  1. import java.util.Vector;
  2. import java.util.List;
  3. import java.util.Iterator;
  4. import java.util.Enumeration;
  5. /**
  6. * @desc Vector测试函数:遍历Vector和常用API
  7. *
  8. * @author skywang
  9. */
  10. public class VectorTest {
  11. public static void main(String[] args) {
  12. // 新建Vector
  13. Vector vec = new Vector();
  14. // 添加元素
  15. vec.add("1");
  16. vec.add("2");
  17. vec.add("3");
  18. vec.add("4");
  19. vec.add("5");
  20. // 设置第一个元素为100
  21. vec.set(0, "100");
  22. // 将“500”插入到第3个位置
  23. vec.add(2, "300");
  24. System.out.println("vec:"+vec);
  25. // (顺序查找)获取100的索引
  26. System.out.println("vec.indexOf(100):"+vec.indexOf("100"));
  27. // (倒序查找)获取100的索引
  28. System.out.println("vec.lastIndexOf(100):"+vec.lastIndexOf("100"));
  29. // 获取第一个元素
  30. System.out.println("vec.firstElement():"+vec.firstElement());
  31. // 获取第3个元素
  32. System.out.println("vec.elementAt(2):"+vec.elementAt(2));
  33. // 获取最后一个元素
  34. System.out.println("vec.lastElement():"+vec.lastElement());
  35. // 获取Vector的大小
  36. System.out.println("size:"+vec.size());
  37. // 获取Vector的总的容量
  38. System.out.println("capacity:"+vec.capacity());
  39. // 获取vector的“第2”到“第4”个元素
  40. System.out.println("vec 2 to 4:"+vec.subList(1, 4));
  41. // 通过Enumeration遍历Vector
  42. Enumeration enu = vec.elements();
  43. while(enu.hasMoreElements())
  44. System.out.println("nextElement():"+enu.nextElement());
  45. Vector retainVec = new Vector();
  46. retainVec.add("100");
  47. retainVec.add("300");
  48. // 获取“vec”中包含在“retainVec中的元素”的集合
  49. System.out.println("vec.retain():"+vec.retainAll(retainVec));
  50. System.out.println("vec:"+vec);
  51. // 获取vec对应的String数组
  52. String[] arr = (String[]) vec.toArray(new String[0]);
  53. for (String str:arr)
  54. System.out.println("str:"+str);
  55. // 清空Vector。clear()和removeAllElements()一样!
  56. vec.clear();
  57. // vec.removeAllElements();
  58. // 判断Vector是否为空
  59. System.out.println("vec.isEmpty():"+vec.isEmpty());
  60. }
  61. }