【小笨鸟看JDK1.7集合源码之四】Vector源码剖析

Vector 简介

(1)Vector类也是以数组结构为基础,可以直接使用数组索引进行访问,但是它具有可自由增长的特性;

(2)实现了RandomAccess支持随机访问,Cloneable可以实现克隆,Serializable能够被序列化;

(3)Vector其实与ArrayList功能类似,但是加入了很多同步语句,因此是线程安全的,适用于多线程环境;但是因为加了同步之后效率会相应降低。

JDK1.7-LinkedList源码详细分析

  1 public class Vector<E>
  2     extends AbstractList<E>
  3     implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  4 {
  5     /**
  6      * 数组缓冲区,用于存放vector中的元素
  7      */
  8     protected Object[] elementData;
  9
 10     /**
 11      *元素个数,Vector 对象中的有效组件数。从 elementData[0] 到 elementData[elementCount-1]
 12      的组件均为实际项。
 13      */
 14     protected int elementCount;
 15
 16     /**
 17      *向量的大小大于其容量时,容量自动增加的量。
 18      如果容量的增量小于等于零,则每次需要增大容量时,向量的容量将增大一倍,
 19      代表的是一个变化的增量,是在扩容时计算;
 20      */
 21     protected int capacityIncrement;
 22
 23     /** use serialVersionUID from JDK 1.0.2 for interoperability */
 24     private static final long serialVersionUID = -2767605614048989439L;
 25
 26     /**
 27     构造函数
 28     initialCapacity:初始容量
 29     capacityIncrement:容量的增量
 30     */
 31     public Vector(int initialCapacity, int capacityIncrement) {
 32         super();
 33         if (initialCapacity < 0)
 34             throw new IllegalArgumentException("Illegal Capacity: "+
 35                                                initialCapacity);
 36         this.elementData = new Object[initialCapacity];//初始化
 37         this.capacityIncrement = capacityIncrement;
 38     }
 39     //不带增量的构造函数
 40     public Vector(int initialCapacity) {
 41         this(initialCapacity, 0);
 42     }
 43     //无参构造函数,默认初始化容量为10,标准容量增量为0
 44     public Vector() {
 45         this(10);
 46     }
 47     /**构造一个包含指定collection中的元素的向量vector*/
 48     public Vector(Collection<? extends E> c) {
 49         elementData = c.toArray();//获取元素数组
 50         elementCount = elementData.length;//数组长度
 51         // c.toArray might (incorrectly) not return Object[] (see 6260652)
 52         //可能返回的是非数组的对象
 53         if (elementData.getClass() != Object[].class)//如果非数组类型的对象
 54             //重新复制构造一个新的数组
 55             elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
 56     }
 57     /**将向量复制到指定的参数数组中,此方法是同步的
 58         复制默认从第一个元素开始,长度为vector中的元素个数,全部复制到参数anArray中;
 59         如果参数数组为空或者容量不够、存储类型异常,会抛出相应异常
 60     */
 61     public synchronized void copyInto(Object[] anArray) {
 62         System.arraycopy(elementData, 0, anArray, 0, elementCount);
 63     }
 64     /**
 65      * 调整向量的实际容量,如果当前向量容量大于其当前大小,则通过复制数组的方式将
 66      容量更改为当前的实际大小。其实就是根据当前容量与向量元素的实际个数不等时作出相应的
 67      调整;
 68      */
 69     public synchronized void trimToSize() {
 70         modCount++;
 71         int oldCapacity = elementData.length;
 72         if (elementCount < oldCapacity) {
 73             elementData = Arrays.copyOf(elementData, elementCount);
 74         }
 75     }
 76     /**
 77      * 确认容量,是否能容纳指定参数大小的容量
 78      */
 79     public synchronized void ensureCapacity(int minCapacity) {
 80         if (minCapacity > 0) {
 81             modCount++;
 82             ensureCapacityHelper(minCapacity);
 83         }
 84     }
 85     /**
 86      * 确认是否要扩容,如果指定参数大于当前的实际容量,则直接扩容,以参数为默认大小。
 87      */
 88     private void ensureCapacityHelper(int minCapacity) {
 89         // overflow-conscious code
 90         if (minCapacity - elementData.length > 0)
 91             grow(minCapacity);
 92     }
 93     /**
 94      默认的最大的数组容量为Integer.MAX_VALUE - 8,不能超过此容量,不然JVM会抛出OutOfMemoryError;
 95      那8个字节主要是VM保留的字节,用于表示数组的长度,在JVM解析中。
 96      */
 97     private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
 98
 99     //扩容
100     private void grow(int minCapacity) {
101         // overflow-conscious code
102         int oldCapacity = elementData.length;//当前数组的长度
103         //如果指定了增量且大于0,则直接以增量大小扩容,否则增量取当前数组的长度,即直接增加到原来的两倍
104         int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
105                                          capacityIncrement : oldCapacity);
106         if (newCapacity - minCapacity < 0)//如果扩容后长度还是小于指定的最小参数minCapacity
107             newCapacity = minCapacity;//则以minCapacity参数大小扩容
108         if (newCapacity - MAX_ARRAY_SIZE > 0)//主要是为了防止内存溢出
109             newCapacity = hugeCapacity(minCapacity);
110         elementData = Arrays.copyOf(elementData, newCapacity);
111     }
112     //防止超出最大的数组范围,如果超出默认取最大值
113     private static int hugeCapacity(int minCapacity) {
114         if (minCapacity < 0) // overflow
115             throw new OutOfMemoryError();
116         return (minCapacity > MAX_ARRAY_SIZE) ?
117             Integer.MAX_VALUE :
118             MAX_ARRAY_SIZE;
119     }
120     /**
121      * 设置向量的大小
122      (1)如果设置的参数值大于向量的大小,则先扩容,再在后面补齐相应数量的null项
123      (2)如果设置的参数值小于向量的大小,则直接将多余的长度丢弃,后面的项也直接设置为null
124      */
125     public synchronized void setSize(int newSize) {
126         modCount++;
127         if (newSize > elementCount) {
128             ensureCapacityHelper(newSize);
129         } else {
130             for (int i = newSize ; i < elementCount ; i++) {
131                 elementData[i] = null;
132             }
133         }
134         elementCount = newSize;//更新长度,后面的null值项直接被回收
135     }
136     /**
137      *返回此向量的当前容量,也就是实际数组的长度
138      */
139     public synchronized int capacity() {
140         return elementData.length;
141     }
142     /**
143      * 返回此向量中的组件数
144      */
145     public synchronized int size() {
146         return elementCount;
147     }
148     /**
149      * 是否为空
150      */
151     public synchronized boolean isEmpty() {
152         return elementCount == 0;
153     }
154     /**
155      * 返回此向量的组件的枚举。返回的 Enumeration 对象将生成此向量中的所有项。
156      生成的第一项为索引 0 处的项,然后是索引 1 处的项,依此类推。
157      */
158     public Enumeration<E> elements() {
159         return new Enumeration<E>() {
160             int count = 0;
161
162             public boolean hasMoreElements() {
163                 return count < elementCount;
164             }
165
166             public E nextElement() {
167                 synchronized (Vector.this) {
168                     if (count < elementCount) {
169                         return elementData(count++);
170                     }
171                 }
172                 throw new NoSuchElementException("Vector Enumeration");
173             }
174         };
175     }
176     /**
177      * 是否包含某个指定元素,此元素可以是null值
178      */
179     public boolean contains(Object o) {
180         return indexOf(o, 0) >= 0;
181     }
182     /**
183      * 返回指定元素第一次出现的索引,如果不包含返回-1
184      */
185     public int indexOf(Object o) {
186         return indexOf(o, 0);
187     }
188     /**
189      * 返回指定元素第一次出现的索引,从指定索引index开始查找,如果不包含返回-1;
190      注意一下,null值与普通值也是分开查找的
191      */
192     public synchronized int indexOf(Object o, int index) {
193         if (o == null) {
194             for (int i = index ; i < elementCount ; i++)
195                 if (elementData[i]==null)
196                     return i;
197         } else {
198             for (int i = index ; i < elementCount ; i++)
199                 if (o.equals(elementData[i]))
200                     return i;
201         }
202         return -1;
203     }
204     /**
205      *反向查找指定元素出现的第一次索引位置
206      */
207     public synchronized int lastIndexOf(Object o) {
208         return lastIndexOf(o, elementCount-1);//默认参数是最后一个元素的索引
209     }
210     /**
211      * 反向查找指定元素出现的第一次索引位置,从指定索引index处开始
212      */
213     public synchronized int lastIndexOf(Object o, int index) {
214         if (index >= elementCount)
215             throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
216         //也是将null值与普通元素分开查询
217         if (o == null) {
218             for (int i = index; i >= 0; i--)
219                 if (elementData[i]==null)
220                     return i;
221         } else {
222             for (int i = index; i >= 0; i--)
223                 if (o.equals(elementData[i]))
224                     return i;
225         }
226         return -1;
227     }
228     /**
229      * 返回指定索引处的元素
230      */
231     public synchronized E elementAt(int index) {
232         if (index >= elementCount) {
233             throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
234         }
235
236         return elementData(index);
237     }
238     /**
239      * 返回第一个元素组件
240      */
241     public synchronized E firstElement() {
242         if (elementCount == 0) {
243             throw new NoSuchElementException();
244         }
245         return elementData(0);
246     }
247     /**
248      * 返回最后一个元素组件
249      */
250     public synchronized E lastElement() {
251         if (elementCount == 0) {
252             throw new NoSuchElementException();
253         }
254         return elementData(elementCount - 1);
255     }
256
257     /**
258      * 在指定的索引位置index处设置指定的新的值obj
259      */
260     public synchronized void setElementAt(E obj, int index) {
261         if (index >= elementCount) {
262             throw new ArrayIndexOutOfBoundsException(index + " >= " +
263                                                      elementCount);
264         }
265         elementData[index] = obj;
266     }
267
268     /**
269      * 删除指定索引位置的组件。
270      */
271     public synchronized void removeElementAt(int index) {
272         modCount++;
273         if (index >= elementCount) {
274             throw new ArrayIndexOutOfBoundsException(index + " >= " +
275                                                      elementCount);
276         }
277         else if (index < 0) {
278             throw new ArrayIndexOutOfBoundsException(index);
279         }
280         int j = elementCount - index - 1;
281         if (j > 0) {//执行数组复制移位覆盖
282         /*假设数组元素为1-2-3-4-5,index=2,即从索引下标2移除,则elementCount=5,j=2
283         (1)elementData从index+1处开始取j个元素,即4-5
284         (2)从elementData指定索引index=2处开始覆盖,即1-2-4-5-5
285         (3)将最后的元素设置为null,被GC回收
286         */
287             System.arraycopy(elementData, index + 1, elementData, index, j);
288         }
289         elementCount--;//更新长度
290         elementData[elementCount] = null; /* to let gc do its work */
291     }
292
293     /**
294      * 在指定索引处插入一个指定obj组件
295      */
296     public synchronized void insertElementAt(E obj, int index) {
297         modCount++;
298         if (index > elementCount) {
299             throw new ArrayIndexOutOfBoundsException(index
300                                                      + " > " + elementCount);
301         }
302         //先扩容,增量为1
303         ensureCapacityHelper(elementCount + 1);
304         //执行数组复制移位覆盖,index处为null值
305         System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
306         elementData[index] = obj;//给index处赋值
307         elementCount++;//更新长度
308     }
309
310     /**
311      * 在末尾添加指定的组件
312      */
313     public synchronized void addElement(E obj) {
314         modCount++;
315         ensureCapacityHelper(elementCount + 1);//先扩容,增量为1
316         elementData[elementCount++] = obj;//直接在末尾添加一个元素,并且赋值
317     }
318
319     /**
320      * 删除指定值的组件
321      */
322     public synchronized boolean removeElement(Object obj) {
323         modCount++;
324         int i = indexOf(obj);//先找到指定值的索引位置
325         if (i >= 0) {//如果存在,则直接调用删除指定索引位置方法删除
326             removeElementAt(i);
327             return true;
328         }
329         return false;
330     }
331
332     /**
333      * 移除所有的组件
334      */
335     public synchronized void removeAllElements() {
336         modCount++;
337         // Let gc do its work,也就是将所有的元素都设置为null,之后由GC回收掉
338         for (int i = 0; i < elementCount; i++)
339             elementData[i] = null;
340
341         elementCount = 0;
342     }
343
344     /**
345      * 返回向量的一个副本。副本中将包含一个对内部数据数组副本的引用,
346      而非对此 Vector 对象的原始内部数据数组的引用。
347      */
348     public synchronized Object clone() {
349         try {
350             @SuppressWarnings("unchecked")
351                 Vector<E> v = (Vector<E>) super.clone();//产生一个新的vector对象
352                 //内部实际上是复制产生一个新的数组,将新的对象指向这个数组
353             v.elementData = Arrays.copyOf(elementData, elementCount);
354             v.modCount = 0;
355             return v;
356         } catch (CloneNotSupportedException e) {
357             // this shouldn‘t happen, since we are Cloneable
358             throw new InternalError();
359         }
360     }
361
362     /**
363      * 返回一个数组,包含顺序存放的所有元素
364      */
365     public synchronized Object[] toArray() {
366         return Arrays.copyOf(elementData, elementCount);
367     }
368
369     /**
370      * 运行时指定返回的数组类型
371      1、如果给定的数组长度小于向量中元素的个数,则返回一个复制的数组,类型为指定的类型,数组后面用null值填充;
372      2、如果给定的数组长度大于向量中元素的个数,则直接全部复制到数组中;
373      */
374     @SuppressWarnings("unchecked")
375     public synchronized <T> T[] toArray(T[] a) {
376         if (a.length < elementCount)//1
377             return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());
378
379         System.arraycopy(elementData, 0, a, 0, elementCount);//2
380
381         if (a.length > elementCount)//填充null值
382             a[elementCount] = null;
383
384         return a;
385     }
386
387     // 返回指定位置的组件,其实与get(int)方法功能完全相同
388     @SuppressWarnings("unchecked")
389     E elementData(int index) {
390         return (E) elementData[index];
391     }
392
393     /**
394      * 返回指定位置的元素
395      */
396     public synchronized E get(int index) {
397         if (index >= elementCount)
398             throw new ArrayIndexOutOfBoundsException(index);
399
400         return elementData(index);
401     }
402
403     /**
404      * 给指定索引index处设置指定值element
405      */
406     public synchronized E set(int index, E element) {
407         if (index >= elementCount)
408             throw new ArrayIndexOutOfBoundsException(index);
409
410         E oldValue = elementData(index);
411         elementData[index] = element;//覆盖旧的值
412         return oldValue;//返回旧的值
413     }
414
415     /**
416      * 在向量尾部添加一个指定元素e
417      */
418     public synchronized boolean add(E e) {
419         modCount++;
420         ensureCapacityHelper(elementCount + 1);//先扩容,增量为1
421         elementData[elementCount++] = e;//赋值
422         return true;
423     }
424
425     /**
426      * 从向量头部开始移除匹配到的第一个指定元素o
427      */
428     public boolean remove(Object o) {
429         return removeElement(o);
430     }
431
432     /**
433      * 在指定的索引位置index处添加指定新的值element
434      */
435     public void add(int index, E element) {
436         insertElementAt(element, index);
437     }
438
439     /**
440      * 移除指定索引index处的元素,并且返回此元素
441      */
442     public synchronized E remove(int index) {
443         modCount++;
444         if (index >= elementCount)
445             throw new ArrayIndexOutOfBoundsException(index);
446         E oldValue = elementData(index);
447
448         int numMoved = elementCount - index - 1;
449         if (numMoved > 0)
450             //实际上就是将index的后面元素集体往前面移动一个位置覆盖
451             System.arraycopy(elementData, index+1, elementData, index,
452                              numMoved);
453         elementData[--elementCount] = null; //再将最后一个元素值null回收掉
454
455         return oldValue;
456     }
457
458     /**
459      * 移除向量中所有的元素
460      */
461     public void clear() {
462         removeAllElements();
463     }
464
465     /**
466      * 此向量是否包含指定组件的所有元素
467      */
468     public synchronized boolean containsAll(Collection<?> c) {
469         return super.containsAll(c);
470     }
471
472     /**
473      * 将指定容器中的元素添加到此向量的尾部
474      */
475     public synchronized boolean addAll(Collection<? extends E> c) {
476         modCount++;
477         Object[] a = c.toArray();
478         int numNew = a.length;
479         ensureCapacityHelper(elementCount + numNew);//以参数中的元素长度为增量扩容
480         System.arraycopy(a, 0, elementData, elementCount, numNew);//产生新的数组
481         elementCount += numNew;//更新向量中元素的个数
482         return numNew != 0;
483     }
484
485     /**
486      *移除向量中所有的元素
487      */
488     public synchronized boolean removeAll(Collection<?> c) {
489         return super.removeAll(c);
490     }
491
492     /**
493      *只保留指定容器中包含的元素
494      */
495     public synchronized boolean retainAll(Collection<?> c) {
496         return super.retainAll(c);
497     }
498
499     /**
500      *从指定的索引index处,将指定容器c中的所有元素插入到此向量中
501      */
502     public synchronized boolean addAll(int index, Collection<? extends E> c) {
503         modCount++;
504         if (index < 0 || index > elementCount)
505             throw new ArrayIndexOutOfBoundsException(index);
506
507         Object[] a = c.toArray();
508         int numNew = a.length;
509         ensureCapacityHelper(elementCount + numNew);//先扩容,增量为指定容器中元素的长度
510
511         int numMoved = elementCount - index;
512         if (numMoved > 0)//如果插入位置没有超过向量元素索引下标
513             System.arraycopy(elementData, index, elementData, index + numNew,
514                              numMoved);
515         //如果插入位置刚好在尾部
516         System.arraycopy(a, 0, elementData, index, numNew);
517         elementCount += numNew;
518         return numNew != 0;
519     }
520
521     /**
522      * 比较指定对象与此向量的相等性。当且仅当指定的对象也是一个 List、两个 List 大小相同,
523      并且其中所有对应的元素对都相等 时才返回 true。(如果 (e1==null ? e2==null : e1.equals(e2)),
524      则两个元素 e1 和 e2 相等)。
525      换句话说,如果两个 List 包含相同顺序的相同元素,则这两个 List 就定义为相等。
526      */
527     public synchronized boolean equals(Object o) {
528         return super.equals(o);
529     }
530
531     /**
532      * 返回此向量的hash值
533      */
534     public synchronized int hashCode() {
535         return super.hashCode();
536     }
537
538     /**
539      * 返回此向量的字符串表示形式,其中包含每个元素的String表示形式
540      */
541     public synchronized String toString() {
542         return super.toString();
543     }
544
545     /**
546      *返回此 List 的部分视图,元素范围为从 fromIndex(包括)到 toIndex(不包括)。
547      */
548     public synchronized List<E> subList(int fromIndex, int toIndex) {
549         return Collections.synchronizedList(super.subList(fromIndex, toIndex),
550                                             this);
551     }
552
553     /**
554      * 移除向量中指定参数范围内的所有元素,元素范围为从 fromIndex(包括)到 toIndex(不包括)
555      */
556     protected synchronized void removeRange(int fromIndex, int toIndex) {
557         modCount++;
558         int numMoved = elementCount - toIndex;//如果numMoved小于0,会直接抛出异常
559         /**还是实际例子说明:向量中初始元素为 1,2,3,4,5,6 elementCount=6,
560         参数假设fromIndex=2,toIndex=4 则numMoved = 2;
561         (1)从toIndex=4(包含)开始取长度为numMoved = 2数组,即5,6
562         (2)从fromIndex=2(包含)开始用(1)中的数组覆盖,即1,2,5,6,5,6
563         (3)将最后的5,6设置为null,回收,实现了范围删除
564         */
565         System.arraycopy(elementData, toIndex, elementData, fromIndex,
566                          numMoved);
567
568         // Let gc do its work
569         int newElementCount = elementCount - (toIndex-fromIndex);
570         while (elementCount != newElementCount)
571             elementData[--elementCount] = null;//将最后的元素设置为null,被GC回收
572     }
573
574     /**
575      * 序列化写入函数
576      */
577     private void writeObject(java.io.ObjectOutputStream s)
578             throws java.io.IOException {
579         final java.io.ObjectOutputStream.PutField fields = s.putFields();
580         final Object[] data;
581         synchronized (this) {
582             fields.put("capacityIncrement", capacityIncrement);
583             fields.put("elementCount", elementCount);
584             data = elementData.clone();
585         }
586         fields.put("elementData", data);
587         s.writeFields();
588     }
589
590     /**
591      * 迭代
592      */
593     public synchronized ListIterator<E> listIterator(int index) {
594         if (index < 0 || index > elementCount)
595             throw new IndexOutOfBoundsException("Index: "+index);
596         return new ListItr(index);
597     }
598
599     /**
600      * Returns a list iterator over the elements in this list (in proper
601      * sequence).
602      *
603      * <p>The returned list iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
604      *
605      * @see #listIterator(int)
606      */
607     public synchronized ListIterator<E> listIterator() {
608         return new ListItr(0);
609     }
610
611     public synchronized Iterator<E> iterator() {
612         return new Itr();
613     }
614
615     private class Itr implements Iterator<E> {
616         int cursor;       // 下一个要迭代元素的索引
617         int lastRet = -1; // 上一个元素的索引位置,lastRet永远比cursor小1,cursor位于开始位置0时,lastRet初始化为-1
618         int expectedModCount = modCount;
619
620         public boolean hasNext() {
621             // 向量中后序是否还有元素可以迭代
622             return cursor != elementCount;
623         }
624
625         public E next() {//同步的迭代下一个元素
626             synchronized (Vector.this) {
627                 checkForComodification();
628                 int i = cursor;
629                 if (i >= elementCount)
630                     throw new NoSuchElementException();
631                 cursor = i + 1;
632                 return elementData(lastRet = i);//每次迭代后更新前一个索引
633             }
634         }
635
636         public void remove() {//移除前一个元素
637             if (lastRet == -1)
638                 throw new IllegalStateException();
639             synchronized (Vector.this) {
640                 checkForComodification();
641                 Vector.this.remove(lastRet);
642                 expectedModCount = modCount;
643             }
644             cursor = lastRet;
645             lastRet = -1;
646         }
647
648         final void checkForComodification() {
649             if (modCount != expectedModCount)
650                 throw new ConcurrentModificationException();
651         }
652     }
653
654     /**
655      * An optimized version of AbstractList.ListItr
656      */
657     final class ListItr extends Itr implements ListIterator<E> {
658         ListItr(int index) {
659             super();
660             cursor = index;//int cursor 下一个要迭代元素的索引
661         }
662
663         public boolean hasPrevious() {//当前迭代的元素前面是否有元素,即是否为第一个元素
664             return cursor != 0;
665         }
666
667         public int nextIndex() {//下一个要迭代元素的索引
668             return cursor;
669         }
670
671         public int previousIndex() {//返回当前迭代元素的前一个元素的索引
672             return cursor - 1;
673         }
674
675         public E previous() {//返回当前迭代元素的前一个元素
676             synchronized (Vector.this) {
677                 checkForComodification();
678                 int i = cursor - 1;
679                 if (i < 0)
680                     throw new NoSuchElementException();
681                 cursor = i;
682                 return elementData(lastRet = i);
683             }
684         }
685
686         public void set(E e) {//在当前迭代的前面索引处设置指定元素值
687             if (lastRet == -1)
688                 throw new IllegalStateException();
689             synchronized (Vector.this) {
690                 checkForComodification();
691                 Vector.this.set(lastRet, e);//实际上内部调用的是设置元素,在指定位置
692             }
693         }
694
695         public void add(E e) {//添加当前迭代的位置插入指定元素
696             int i = cursor;
697             synchronized (Vector.this) {
698                 checkForComodification();
699                 Vector.this.add(i, e);//实际上内部调用的是插入元素,在i位置
700                 expectedModCount = modCount;
701             }
702             cursor = i + 1;
703             lastRet = -1;
704         }
705     }
706 }

总结以下:

1、无参构造函数,默认初始化容量为10,标准容量增量为0;

2、执行扩容时,如果指定了增量且大于0,则直接以增量大小扩容,否则增量取当前数组的长度,即直接增加到原来的两倍;

3、默认的最大的数组容量为Integer.MAX_VALUE - 8,不能超过此容量,不然JVM会抛出OutOfMemoryError;那8个字节主要是VM保留的字节,用于表示数组的长度,在JVM解析中。

4、设置向量的大小时:

(1)如果设置的参数值大于向量的大小,则先扩容,再在后面补齐相应数量的null项;
(2)如果设置的参数值小于向量的大小,则直接将多余的长度丢弃,后面的项也直接设置为null。

5、在执行查找时,null值元素与非空元素也是分开遍历查找;

时间: 2024-11-03 01:48:18

【小笨鸟看JDK1.7集合源码之四】Vector源码剖析的相关文章

【小笨鸟看JDK1.7集合源码之一】JAVA集合整体框架

首先这只是我的笔记,可能会有错误,如果能入各位看官法眼请随意指出,我会虚心接受~~ 主要是参考大神的博客 http://blog.csdn.net/column/details/collection.html java集合工具包位于util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习集合框架大致可以分为五个部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). 下面是框架图:

【小笨鸟看JDK1.7集合源码之三】LinkedList源码剖析

LinkedList简介 (1)基于双向循环链表的结构,实现了Deque接口,可以用作堆栈.队列或双端队列使用: (2)实现为非同步的,即在多线程下是不安全的,单线程安全: (3)实现了Cloneable.Serializable,可以克隆与被序列化: JDK1.7-LinkedList源码详细分析 1 package java.util; 2 /** 3 * JDK1.7 4 * @author foolishbird_lmy 5 * 为了便于观察分析,我调整了一些方法的位置,相应的私有方法我

Java集合之Vector源码分析

概述 Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面就不具体分析源码了, 具体可以查看ArrayList中的源码分析. Vector源码分析 1.主要字段 2.构造函数 3.增删改查 其他方法大部分类似, 不再赘述, 下面看下扩容机制的函数: Vector与ArrayList的区别 Vector是线程安全的, ArrayList不是线程安全的, 这是

List集合就这么简单【源码剖析】

前言 声明,本文用得是jdk1.8 前一篇已经讲了Collection的总览:Collection总览,介绍了一些基础知识. 现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是数组.线程不安全 LinkedList 底层数据结构是链表.线程不安全 Vector 底层数据结构是数组.线程安全 这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个- 看这篇文章之前最好是有点数据结构的基础:Java实现单向链表,栈和队列就是这么简单,二叉树就

Java程序员从笨鸟到菜鸟之(一百零三)java操作office和pdf文件(一)java读取word,excel和pd

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下java对word.excel.pdf文件的读取.本篇博客只是讲解简单应用.如果想深入了解原理.请读者自行研究一些相关源码. 首先我们来认识一下读取相关文档的jar包: 1. 引用POI包读取word文档内容 poi.jar 下载地址 http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.ziph

转:【Java集合源码剖析】Vector源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/35793865   Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境. Vector没有丝线Serializable接口,因此它不支持序列化,实现了Cloneable接口,能被克隆,实

Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所以...呵呵..你懂得,昨天又仔细的学习了一遍,感觉其实java网络编程也没想象的那么难,不信,咱一起看看...呵呵.. 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴.在发送和接收数据时,大

【Java集合源码剖析】Vector源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/35793865 Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. LinkedList是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境. LinkedList没有丝线Serializable接口,因此它不支持序列化,实现了Cloneable接口,

Java 集合系列06之 Vector详细介绍(源码解析)和使用示例

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