Java集合系列[5]-Vector分析与源码解析

概述

之前已经学习过了ArrayList和LinkedList,也学习过了fail-fast机制。今天我们接着学习Collection框架中的另一个重要成员Vector。大概还是分为下面几个部分:

  1. Vector简介
  2. Vector的数据结构
  3. Vector源码解析(基于JDK1.8)
  4. Vector的遍历方式

Vector简介

1
2
3
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable

Vector是矢量队列,继承于AbstractList,实现了List、RandomAccess、Cloneable和java.io.Serializable。

  • Vector继承了AbstractList,实现了List,所以它是一个队列,支持相关CRUD和遍历等的功能;
  • Vector实现了RandomAccess,说明它提供了随机访问的功能。RandomAccess是java中用来被List发现,为List提供快速访问功能的。在vector中,我们即可以通过元素的索引值来快速获取元素,这就是快速随机访问;
  • Vector实现了Cloneable,说明它实现了clone()方法,能被克隆;
  • Vector实现了java.io.Serializable,说明它能够被序列化;

和ArrayList不同的是,Vector是同步的,所以它的操作是线程安全的

Vector的构造方法

1
2
3
4
public Vector(); //构造一个initialCapacity为10,capacityIncrement为0(容量溢出时double)的Vector
public Vector(int initialCapacity);//构造一个容量为指定initialCapacity,capactiryIncrement为0(容量溢出时double)的Vector
public Vector(int initialCapacity, int capacityIncrement);//构造一个容量为initialCapacity,容量增量为capacityIncrement的Vector
public Vector(Collection<? extends E> c);//创建一个包含Collection的Vector,容量为集合的数量,容量增量为0(容量溢出时double)的Vector

Vector的API

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
public synchronized void copyInto(Object[] anArray); //把集合内容拷贝到指定数组中
public synchronized void trimToSize();//调整容量为当前的元素数量
public synchronized void ensureCapacity(int minCapacity);//提升vector的容量
public synchronized void setSize(int newSize);//设置vector的大小
public synchronized int capacity();//获取当前vector的容量
public synchronized int size();//获取当前vector的元素数量
public synchronized boolean isEmpty();//判断当前vector是否有元素
public Enumeration<E> elements();//返回一个列举器
public boolean contains(Object o);//判断是否包含该元素
public int indexOf(Object o);//返回指定元素的索引值
public synchronized int indexOf(Object o, int index);//从指定位置开始查找,返回指定元素的索引值
public synchronized int lastIndexOf(Object o);//从尾部往前查找,查找指定元素的索引值
public synchronized E elementAt(int index);//返回指定索引值上的元素
public synchronized E firstElement();//获取vector的第一个元素
public synchronized E lastElement();//获取vector的最后一个元素
public synchronized void setElementAt(E obj, int index);//更新指定索引值上的元素为指定元素
public synchronized void removeElementAt(int index);//删除指定索引值上的元素
public synchronized void insertElementAt(E obj, int index);//在指定索引值上插入元素
public synchronized void addElement(E obj);//添加元素到vector的尾部
public synchronized boolean removeElement(Object obj);//删除在vector低位置的指定元素
public synchronized void removeAllElements();//删除所有元素(置null)
public synchronized Object clone();//返回当前vector的一个复制
public synchronized Object[] toArray();//返回包含当前vector所有元素的一个数组
public synchronized <T> T[] toArray(T[] a);//返回指定类型的一个包含当前vector全部元素的数组
public synchronized E get(int index);//获取指定索引值上的元素
public synchronized E set(int index, E element);//用指定元素代替索引值上的元素
public synchronized boolean add(E e);//添加一个元素到尾部
public boolean remove(Object o);//删除元素
public void add(int index, E element);//在指定位置上添加元素
public synchronized E remove(int index);//删除指定位置上的元素
public void clear();//清空所有元素
public synchronized boolean containsAll(Collection<?> c);//判断当前vector是否包含指定集合的所有元素
public synchronized boolean addAll(Collection<? extends E> c);//把指定集合的所有元素添加到vector的尾部
public synchronized boolean removeAll(Collection<?> c);//删除当前vector与c中元素相等的元素
public synchronized boolean retainAll(Collection<?> c);//删除当前vector与c中元素不相等的元素
public synchronized List<E> subList(int fromIndex, int toIndex);//返回[fromIndex, toIndex)的元素的数组
public synchronized ListIterator<E> listIterator();//返回一个列表迭代器
public synchronized ListIterator<E> listIterator(int index);//返回一个在指定位置上的列表迭代器
public synchronized Iterator<E> iterator();//返回一个迭代器
public synchronized void forEach(Consumer<? super E> action);//遍历每一个元素并在每个元素上执行指定的Consumer
public synchronized boolean removeIf(Predicate<? super E> filter);//删除所有满足指定Predicate条件的元素
public synchronized void replaceAll(UnaryOperator<E> operator);//用指定UnaryOperator处理的结果替换每一个元素
public synchronized void sort(Comparator<? super E> c);//根据指定的比较器对当前vector进行排序
public Spliterator<E> spliterator();//返回一个分割迭代器

数据结构分析

Vector的继承关系

java.lang.Object
    java.util.AbstractCollection<E>
        java.util.AbstractList<E>
            java.util.Vector<E>

Vector与Collection的关系

Vector与Collection的关系图

Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData(对应ArrayList的elementDate), elementCount(对应ArrayList的size), capacityIncrement(ArrayList没有).

  1. elementDate 是Object[]类型的数组,它保存了保存到Vector的元素.elementData是一个动态数组,如果初始化Vector的时候没有指定动态数组的容量,则使用默认容量10.随着Vector中元素的增加,Vector的容量也会随着增长, capacityIncrement是与增长相关的增长系数,具体的增长方式,可查看源码中的ensureCapacity方法.
  2. elementCount是动态数组的实际大小.
  3. capacityIncrement是动态数组的增长系数.如果在创建Vector指定了capacityIncrement,那么每次vector增长的时候,增加的大小都是capacityIncrement;如果创建的时候没有指定,则为容量double.
    1
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);

Vector的源码分析(基于JDK 1.8.0_73)

源码分析

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
package java.util;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
//存放元素的动态数组
protected Object[] elementData;
//元素数量
protected int elementCount;
//增长系数
protected int capacityIncrement;
private static final long serialVersionUID = -2767605614048989439L;
//指定初始容量和增长系数
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
//指定初始容量
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
//默认容量为10
public Vector() {
this(10);
}
public Vector(Collection<? extends E> c) {
//获取集合c的数组,并将其赋值给elementData
elementData = c.toArray();
//设置动态数组的长度
elementCount = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}
//将vector的元素全部拷贝到anArray数组中
public synchronized void copyInto(Object[] anArray) {
System.arraycopy(elementData, 0, anArray, 0, elementCount);
}
//将当前容量设置=实际元素长度
public synchronized void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}
}
//确保容量不低于minCapacity
public synchronized void ensureCapacity(int minCapacity) {
//如果minCapacity=<0,那么确保肯定成立,所以不用处理
if (minCapacity > 0) {
modCount++;
ensureCapacityHelper(minCapacity);
}
}
//容量确认的帮助器
private void ensureCapacityHelper(int minCapacity) {
//如果minCapacity大于当前长度,那么肯定是要扩容了.
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//由于1-部分VM对数组长度有限制(无法改变)/2-Java堆空间(-Xmx修改),
//对数组的最大长度限制一下,确保不会抛出OutOfMemoryError
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//容量增长方法
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//如果增长系数大于0,容量就增加增长系数的数量;
//否则,动态数组的容量就double.
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
//每次增长都确保容量不低于minCapacity,上面虽然动态数组的容量自己已经增加了,
//但是不能保证不低于minCapacity,所以这里还要判断一下
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//当然啦,也不能超过数组的最大长度
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//动态数组的容量确认了,是时候把所有元素拷贝到一个新容量的数组了
elementData = Arrays.copyOf(elementData, newCapacity);
}
//获取最大容量
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // 溢出了
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
//设置vector的大小为newSize
public synchronized void setSize(int newSize) {
//修改计数器+1
modCount++;
//如果newSize大于当前的元素长度,那么就扩容;
//否则,把超过newSize位置开始的元素都清空掉;
if (newSize > elementCount) {
ensureCapacityHelper(newSize);
} else {
for (int i = newSize ; i < elementCount ; i++) {
elementData[i] = null;
}
}
elementCount = newSize;
}
//获取当前容量
public synchronized int capacity() {
return elementData.length;
}
//获取当前元素长度elementCount
public synchronized int size() {
return elementCount;
}
//判断vector是不是空
public synchronized boolean isEmpty() {
return elementCount == 0;
}
//获取当前vector的一个列举器
public Enumeration<E> elements() {
//通过匿名类实现Enumeration
return new Enumeration<E>() {
int count = 0;
//下一个要访问的元素是否存在
public boolean hasMoreElements() {
return count < elementCount;
}
//获取下一个访问的元素
public E nextElement() {
// 获取当前Vector对象的同步锁(原来匿名类是这么访问外部类的对象锁的)
synchronized (Vector.this) {
if (count < elementCount) {
return elementData(count++);
}
}
throw new NoSuchElementException("Vector Enumeration");
}
};
}
//判断vector中是否包含对象o
public boolean contains(Object o) {
return indexOf(o, 0) >= 0;
}
//从前往后寻找对象o,返回其索引值;
public int indexOf(Object o) {
return indexOf(o, 0);
}
//从index位置开始从前往后寻找对象o,
//存在多个,则返回最低位置的索引值;
//不存在,则返回-1;
public synchronized int indexOf(Object o, int index) {
//如果是对象o是null,那么就用"=="来判断
//否则,用"equals()"来判断
if (o == null) {
for (int i = index ; i < elementCount ; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = index ; i < elementCount ; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
//从后往前寻找,获取对象o的索引值
public synchronized int lastIndexOf(Object o) {
return lastIndexOf(o, elementCount-1);
}
//从index位置开始,从后往前寻找,返回对象o的索引值
public synchronized int lastIndexOf(Object o, int index) {
if (index >= elementCount)
throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
//如果对象o是null,那么用"=="来比对
//否则,用"equals()"来比对
if (o == null) {
for (int i = index; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = index; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
//返回index位置上的元素
public synchronized E elementAt(int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}
return elementData(index);
}
//返回第一个元素
public synchronized E firstElement() {
if (elementCount == 0) {
throw new NoSuchElementException();
}
return elementData(0);
}
//返回最后一个元素
public synchronized E lastElement() {
if (elementCount == 0) {
throw new NoSuchElementException();
}
return elementData(elementCount - 1);
}
//替换index位置上的元素为对象obj
public synchronized void setElementAt(E obj, int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
elementData[index] = obj;
}
//删除index位置上对象,后面的元素往前移动
public synchronized void removeElementAt(int index) {
modCount++;
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
int j = elementCount - index - 1;
if (j > 0) {
//把index位置后的元素往前移动1位
System.arraycopy(elementData, index + 1, elementData, index, j);
}
elementCount--;
elementData[elementCount] = null; /* to let gc do its work */
}
//在index位置上插入对象obj,该位置的元素及后面的元素一次往后tui
public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
ensureCapacityHelper(elementCount + 1);
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}
//在vector最后添加对象obj
public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}
//删除对象obj
public synchronized boolean removeElement(Object obj) {
modCount++;
int i = indexOf(obj);
if (i >= 0) {
removeElementAt(i);
return true;
}
return false;
}
//清空所有元素
public synchronized void removeAllElements() {
modCount++;
// 让GC去处理它们吧
for (int i = 0; i < elementCount; i++)
elementData[i] = null;
elementCount = 0;
}
//克隆方法
public synchronized Object clone() {
try {
@SuppressWarnings("unchecked")
Vector<E> v = (Vector<E>) super.clone();
//将当前vector的全部元素拷贝到新的vector中
v.elementData = Arrays.copyOf(elementData, elementCount);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError(e);
}
}
//返回Object数组
public synchronized Object[] toArray() {
return Arrays.copyOf(elementData, elementCount);
}
//返回vector的模板数组,所谓模板数组,就是可以把T设为任意的数据类型
@SuppressWarnings("unchecked")
public synchronized <T> T[] toArray(T[] a) {
//如果给定数组的大小小于vector元素个数,那么就新建一个T类型数组吧
//并且把所有的元素都拷贝到这个新的数组中
if (a.length < elementCount)
return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());
//如果给定数组的大小不小于vector元素个数,那么就直接把vector所有元素都拷贝进去
System.arraycopy(elementData, 0, a, 0, elementCount);
//并且把多余的位置全部置null
if (a.length > elementCount)
a[elementCount] = null;
return a;
}
// 基于位置的访问
//获取index位置上的元素
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
//获取index位置上的元素
public synchronized E get(int index) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
return elementData(index);
}
//替换index位置上的元素为element,并返回该位置上的老元素
public synchronized E set(int index, E element) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
//添加对象e到vector尾部
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
//删除o元素
public boolean remove(Object o) {
return removeElement(o);
}
//在index上添加元素
public void add(int index, E element) {
insertElementAt(element, index);
}
//删除index位置上的元素
public synchronized E remove(int index) {
modCount++;
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
E oldValue = elementData(index);
int numMoved = elementCount - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--elementCount] = null; // Let gc do its work
return oldValue;
}
//清空所有元素
public void clear() {
removeAllElements();
}
// 容器操作
//判断vector是否包含集合c
public synchronized boolean containsAll(Collection<?> c) {
return super.containsAll(c);
}
//把集合c的元素全部添加到vector中
public synchronized boolean addAll(Collection<? extends E> c) {
modCount++;
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityHelper(elementCount + numNew);
System.arraycopy(a, 0, elementData, elementCount, numNew);
elementCount += numNew;
return numNew != 0;
}
//删除集合c中的全部元素
public synchronized boolean removeAll(Collection<?> c) {
return super.removeAll(c);
}
//删除非集合c中的元素
public synchronized boolean retainAll(Collection<?> c) {
return super.retainAll(c);
}
//从index位置开始,添加集合c
public synchronized boolean addAll(int index, Collection<? extends E> c) {
modCount++;
if (index < 0 || index > elementCount)
throw new ArrayIndexOutOfBoundsException(index);
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityHelper(elementCount + numNew);
int numMoved = elementCount - index;
if (numMoved > 0)
System.arraycopy(elementData, index, elementData, index + numNew,
numMoved);
System.arraycopy(a, 0, elementData, index, numNew);
elementCount += numNew;
return numNew != 0;
}
//返回两个对象是否相等
public synchronized boolean equals(Object o) {
return super.equals(o);
}
//计算当前vector的哈希值
public synchronized int hashCode() {
return super.hashCode();
}
public synchronized String toString() {
return super.toString();
}
//获取vector上[fromIndex, toIndex)位置上的元素子集
public synchronized List<E> subList(int fromIndex, int toIndex) {
return Collections.synchronizedList(super.subList(fromIndex, toIndex),
this);
}
//删除[fromIndex, toIndex)位置上的元素子集
protected synchronized void removeRange(int fromIndex, int toIndex) {
modCount++;
int numMoved = elementCount - toIndex;
System.arraycopy(elementData, toIndex, elementData, fromIndex,
numMoved);
// Let gc do its work
int newElementCount = elementCount - (toIndex-fromIndex);
while (elementCount != newElementCount)
elementData[--elementCount] = null;
}
//java.io.serializable的写入方法
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
final java.io.ObjectOutputStream.PutField fields = s.putFields();
final Object[] data;
synchronized (this) {
fields.put("capacityIncrement", capacityIncrement);
fields.put("elementCount", elementCount);
data = elementData.clone();
}
fields.put("elementData", data);
s.writeFields();
}
//返回一个fail-fast机制的列表迭代器
public synchronized ListIterator<E> listIterator(int index) {
if (index < 0 || index > elementCount)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
//fail-fast机制的列表迭代器
public synchronized ListIterator<E> listIterator() {
return new ListItr(0);
}
//返回一个fail-fast机制的迭代器
public synchronized Iterator<E> iterator() {
return new Itr();
}
/**
* AbstractList.Itr的优化版本
*/
private class Itr implements Iterator<E> {
int cursor; // 下一个返回元素的位置
int lastRet = -1; // 最后一个返回元素的位置
int expectedModCount = modCount; //期望修改值
public boolean hasNext() {
// Racy but within spec, since modifications are checked
// within or after synchronization in next/previous
return cursor != elementCount;
}
public E next() {
synchronized (Vector.this) {
checkForComodification();
int i = cursor;
if (i >= elementCount)
throw new NoSuchElementException();
cursor = i + 1;
return elementData(lastRet = i);
}
}
public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
synchronized (Vector.this) {
checkForComodification();
Vector.this.remove(lastRet);
expectedModCount = modCount;
}
cursor = lastRet;
lastRet = -1;
}
@Override
public void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
synchronized (Vector.this) {
final int size = elementCount;
int i = cursor;
if (i >= size) {
return;
}
@SuppressWarnings("unchecked")
final E[] elementData = (E[]) Vector.this.elementData;
if (i >= elementData.length) {
throw new ConcurrentModificationException();
}
while (i != size && modCount == expectedModCount) {
action.accept(elementData[i++]);
}
// update once at end of iteration to reduce heap write traffic
cursor = i;
lastRet = i - 1;
checkForComodification();
}
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
/**
* AbstractList.ListItr的一个优化版本
*/
final class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
super();
cursor = index;
}
public boolean hasPrevious() {
return cursor != 0;
}
public int nextIndex() {
return cursor;
}
public int previousIndex() {
return cursor - 1;
}
public E previous() {
synchronized (Vector.this) {
checkForComodification();
int i = cursor - 1;
if (i < 0)
throw new NoSuchElementException();
cursor = i;
return elementData(lastRet = i);
}
}
public void set(E e) {
if (lastRet == -1)
throw new IllegalStateException();
synchronized (Vector.this) {
checkForComodification();
Vector.this.set(lastRet, e);
}
}
public void add(E e) {
int i = cursor;
synchronized (Vector.this) {
checkForComodification();
Vector.this.add(i, e);
expectedModCount = modCount;
}
cursor = i + 1;
lastRet = -1;
}
}
@Override
public synchronized void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
final int expectedModCount = modCount;
@SuppressWarnings("unchecked")
final E[] elementData = (E[]) this.elementData;
final int elementCount = this.elementCount;
for (int i=0; modCount == expectedModCount && i < elementCount; i++) {
action.accept(elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
@Override
@SuppressWarnings("unchecked")
public synchronized boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
// figure out which elements are to be removed
// any exception thrown from the filter predicate at this stage
// will leave the collection unmodified
int removeCount = 0;
final int size = elementCount;
final BitSet removeSet = new BitSet(size);
final int expectedModCount = modCount;
for (int i=0; modCount == expectedModCount && i < size; i++) {
@SuppressWarnings("unchecked")
final E element = (E) elementData[i];
if (filter.test(element)) {
removeSet.set(i);
removeCount++;
}
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
// shift surviving elements left over the spaces left by removed elements
final boolean anyToRemove = removeCount > 0;
if (anyToRemove) {
final int newSize = size - removeCount;
for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) {
i = removeSet.nextClearBit(i);
elementData[j] = elementData[i];
}
for (int k=newSize; k < size; k++) {
elementData[k] = null; // Let gc do its work
}
elementCount = newSize;
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
return anyToRemove;
}
@Override
@SuppressWarnings("unchecked")
public synchronized void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
final int expectedModCount = modCount;
final int size = elementCount;
for (int i=0; modCount == expectedModCount && i < size; i++) {
elementData[i] = operator.apply((E) elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
@SuppressWarnings("unchecked")
@Override
public synchronized void sort(Comparator<? super E> c) {
final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, elementCount, c);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
//返回一个late-binding机制的分割迭代器
@Override
public Spliterator<E> spliterator() {
return new VectorSpliterator<>(this, null, 0, -1, 0);
}
/** Similar to ArrayList Spliterator */
static final class VectorSpliterator<E> implements Spliterator<E> {
private final Vector<E> list;
private Object[] array;
private int index; // current index, modified on advance/split
private int fence; // -1 until used; then one past last index
private int expectedModCount; // initialized when fence set
/** Create new spliterator covering the given range */
VectorSpliterator(Vector<E> list, Object[] array, int origin, int fence,
int expectedModCount) {
this.list = list;
this.array = array;
this.index = origin;
this.fence = fence;
this.expectedModCount = expectedModCount;
}
private int getFence() { // initialize on first use
int hi;
if ((hi = fence) < 0) {
synchronized(list) {
array = list.elementData;
expectedModCount = list.modCount;
hi = fence = list.elementCount;
}
}
return hi;
}
public Spliterator<E> trySplit() {
int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
return (lo >= mid) ? null :
new VectorSpliterator<E>(list, array, lo, index = mid,
expectedModCount);
}
@SuppressWarnings("unchecked")
public boolean tryAdvance(Consumer<? super E> action) {
int i;
if (action == null)
throw new NullPointerException();
if (getFence() > (i = index)) {
index = i + 1;
action.accept((E)array[i]);
if (list.modCount != expectedModCount)
throw new ConcurrentModificationException();
return true;
}
return false;
}
@SuppressWarnings("unchecked")
public void forEachRemaining(Consumer<? super E> action) {
int i, hi; // hoist accesses and checks from loop
Vector<E> lst; Object[] a;
if (action == null)
throw new NullPointerException();
if ((lst = list) != null) {
if ((hi = fence) < 0) {
synchronized(lst) {
expectedModCount = lst.modCount;
a = array = lst.elementData;
hi = fence = lst.elementCount;
}
}
else
a = array;
if (a != null && (i = index) >= 0 && (index = hi) <= a.length) {
while (i < hi)
action.accept((E) a[i++]);
if (lst.modCount == expectedModCount)
return;
}
}
throw new ConcurrentModificationException();
}
public long estimateSize() {
return (long) (getFence() - index);
}
public int characteristics() {
return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;
}
}
}

总结

  1. Vector实际上是通过一个数组去保存数据的.当我们使用默认构造器去构造Vector的时候,Vector的默认容量是10;
  2. 当Vector容量不足以容纳全部元素时,Vector会自动扩容.若增长系数>0, 则将容量增加增长系数的数值, 否则容量double.
  3. Vector的克隆方法,是把所有的元素克隆到一个数组中.
  4. Vector之所以是线程安全,是因为它的方法都用了synchronized修饰,是同步的.

Vector的遍历

第一种:随机遍历

1
2
3
4
5
6
int j;
int size = vector.size();
//for (int i = 0; i < vector.size(); ++i) {
for (int i = 0; i < size; ++i) {
j = vector.get(i);
}

第二种:迭代器遍历

1
2
3
4
5
int j;
Iterator<Integer> iterator = vector.iterator();
while (iterator.hasNext()) {
j = iterator.next();
}

第三种:forEach遍历

1
2
3
4
int j;
for(Integer i : vector) {
j = i;
}

第四种:Enumeration遍历

1
2
3
4
5
int j;
Enumeration<Integer> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
j = enumeration.nextElement();
}

测试效率的代码如下:

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package com.github.archerda.vector;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
/**
* Create by archerda on 2016/09/03
*/
public class Reverse {
public static void main(String[] args) {
Vector<Integer> list = new Vector<>();
for (int i = 0; i < 1000000; ++i) {
list.add(i);
}
randomAccess(list);
foreachAccess(list);
iteratorAccess(list);
enumerationAccess(list);
System.out.println("---");
randomAccess(list);
foreachAccess(list);
iteratorAccess(list);
enumerationAccess(list);
System.out.println("---");
randomAccess(list);
foreachAccess(list);
iteratorAccess(list);
enumerationAccess(list);
}
private static void randomAccess(Vector<Integer> vector) {
long start = System.currentTimeMillis();
int j;
int size = vector.size();
for (int i = 0; i < size; ++i) {
//for (int i = 0; i < vector.size(); ++i) {
j = vector.get(i);
}
System.out.println("randomAccess:" + (System.currentTimeMillis() - start) + "ms");
}
private static void iteratorAccess(Vector<Integer> vector) {
long start = System.currentTimeMillis();
int j;
Iterator<Integer> iterator = vector.iterator();
while (iterator.hasNext()) {
j = iterator.next();
}
System.out.println("iteratorAccess:" + (System.currentTimeMillis() - start) + "ms");
}
private static void foreachAccess(Vector<Integer> vector) {
long start = System.currentTimeMillis();
int j;
for(Integer i : vector) {
j = i;
}
System.out.println("foreachAccess:" + (System.currentTimeMillis() - start) + "ms");
}
private static void enumerationAccess(Vector<Integer> vector) {
long start = System.currentTimeMillis();
int j;
Enumeration<Integer> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
j = enumeration.nextElement();
}
System.out.println("enumerationAccess:" + (System.currentTimeMillis() - start) + "ms");
}
}

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
randomAccess:30ms
foreachAccess:33ms
iteratorAccess:38ms
enumerationAccess:34ms
---
randomAccess:32ms
foreachAccess:27ms
iteratorAccess:29ms
enumerationAccess:28ms
---
randomAccess:29ms
foreachAccess:31ms
iteratorAccess:31ms
enumerationAccess:34ms

结论:

  1. 遍历Vector的时候,使用随机访问的效率最高,使用迭代器的效率最低;
  2. 使用随机访问的时候,如果在for语句里面用了i < vector.size()每次都获取size,那么随机访问的效率会变到最低;

参考文档