吊打面试官:Vector详细介绍(源码解析)和使用示例

概要

学完ArrayList和LinkedList之后,我们接着学习Vector。学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码;最后再通过实例来学会使用它。
第1部分 Vector介绍
第2部分 Vector数据结构
第3部分 Vector源码解析(基于JDK1.6.0_45)
第4部分 Vector遍历方式
第5部分 Vector示例

第1部分 Vector介绍

Vector简介

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

Vector的构造函数

Vector共有4个构造函数
// 默认构造函数
Vector()

// capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。
Vector(int capacity)

// capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
Vector(int capacity, int capacityIncrement)

// 创建一个包含collection的Vector
Vector(Collection collection)

Vector的API

synchronized boolean        add(E object)
             void           add(int location, E object)
synchronized boolean        addAll(Collection collection)
synchronized boolean        addAll(int location, Collection collection)
synchronized void           addElement(E object)
synchronized int            capacity()
             void           clear()
synchronized Object         clone()
             boolean        contains(Object object)
synchronized boolean        containsAll(Collection collection)
synchronized void           copyInto(Object[] elements)
synchronized E              elementAt(int location)
             Enumeration elements()
synchronized void           ensureCapacity(int minimumCapacity)
synchronized boolean        equals(Object object)
synchronized E              firstElement()
             E              get(int location)
synchronized int            hashCode()
synchronized int            indexOf(Object object, int location)
             int            indexOf(Object object)
synchronized void           insertElementAt(E object, int location)
synchronized boolean        isEmpty()
synchronized E              lastElement()
synchronized int            lastIndexOf(Object object, int location)
synchronized int            lastIndexOf(Object object)
synchronized E              remove(int location)
             boolean        remove(Object object)
synchronized boolean        removeAll(Collection collection)
synchronized void           removeAllElements()
synchronized boolean        removeElement(Object object)
synchronized void           removeElementAt(int location)
synchronized boolean        retainAll(Collection collection)
synchronized E              set(int location, E object)
synchronized void           setElementAt(E object, int location)
synchronized void           setSize(int length)
synchronized int            size()
synchronized List        subList(int start, int end)
synchronized  T[]        toArray(T[] contents)
synchronized Object[]       toArray()
synchronized String         toString()
synchronized void           trimToSize()

第2部分 Vector数据结构

Vector的继承关系

java.lang.Object
   ↳     java.util.AbstractCollection
         ↳     java.util.AbstractList
               ↳     java.util.Vector

public class Vector
    extends AbstractList
    implements List, RandomAccess, Cloneable, java.io.Serializable {}

Vector与Collection关系如下图

吊打面试官:Vector详细介绍(源码解析)和使用示例_第1张图片

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。

第3部分 Vector源码解析(基于JDK1.6.0_45)

为了更了解Vector的原理,下面对Vector源码代码作出分析

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

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

第4部分 Vector遍历方式

Vector支持4种遍历方式。建议使用下面的第二种去遍历Vector,因为效率问题。

(01) 第一种,通过迭代器遍历。即通过Iterator去遍历。

Integer value = null;
int size = vec.size();
for (int i=0; i

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

Integer value = null;
int size = vec.size();
for (int i=0; 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();
}

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

 1 import java.util.*;
 2 
 3 /*
 4  * @desc Vector遍历方式和效率的测试程序。
 5  *
 6  * @author skywang
 7  */
 8 public class VectorRandomAccessTest {
 9 
10     public static void main(String[] args) {
11         Vector vec= new Vector();
12         for (int i=0; i<100000; i++)
13             vec.add(i);
14         iteratorThroughRandomAccess(vec) ;
15         iteratorThroughIterator(vec) ;
16         iteratorThroughFor2(vec) ;
17         iteratorThroughEnumeration(vec) ;
18     
19     }
20 
21     private static void isRandomAccessSupported(List list) {
22         if (list instanceof RandomAccess) {
23             System.out.println("RandomAccess implemented!");
24         } else {
25             System.out.println("RandomAccess not implemented!");
26         }
27 
28     }
29 
30     public static void iteratorThroughRandomAccess(List list) {
31 
32         long startTime;
33         long endTime;
34         startTime = System.currentTimeMillis();
35         for (int i=0; i

运行结果

iteratorThroughRandomAccess:6 ms
iteratorThroughIterator:9 ms
iteratorThroughFor2:8 ms
iteratorThroughEnumeration:7 ms

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

第5部分 Vector示例

下面通过示例学习如何使用Vector

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

运行结果

vec:[100, 2, 300, 3, 4, 5]
vec.indexOf(100):0
vec.lastIndexOf(100):0
vec.firstElement():100
vec.elementAt(2):300
vec.lastElement():5
size:6
capacity:10
vec 2 to 4:[2, 300, 3]
nextElement():100
nextElement():2
nextElement():300
nextElement():3
nextElement():4
nextElement():5
vec.retain():true
vec:[100, 300]
str:100
str:300
vec.isEmpty():true

吊打面试官:Vector详细介绍(源码解析)和使用示例_第2张图片

所有的面试题目都不是一成不变的,特别是像一线大厂,上面的面试题只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(777)领取,祝大家更上一层楼!!!

吊打面试官:Vector详细介绍(源码解析)和使用示例_第3张图片

你可能感兴趣的:(java,spring,sql,面试,数据库架构)