在以前文章ArrayList源碼解析中分析了一下 ArrayList的源碼和一些重要方法,如今對比 ArrayList,總結一下 Vector和 ArrayList的不一樣。html
1 public class Vector<E> 2 extends AbstractList<E> 3 implements List<E>, RandomAccess, Cloneable, java.io.Serializable java
Vector 是矢量隊列,它是JDK1.0版本添加的類。繼承於AbstractList,實現了List, RandomAccess, Cloneable這些接口。
Vector 繼承了AbstractList,實現了List;因此,它是一個隊列,支持相關的添加、刪除、修改、遍歷等功能。
Vector 實現了RandmoAccess接口,即提供了隨機訪問功能。RandmoAccess是java中用來被List實現,爲List提供快速訪問功能的。在Vector中,咱們便可以經過元素的序號快速獲取元素對象;這就是快速隨機訪問。
Vector 實現了Cloneable接口,即實現clone()函數。它能被克隆。
和ArrayList不一樣,Vector中的操做是線程安全的。數組
Vector與Collection關係以下圖:
安全
與ArrayList相比,Vector多了一個capacityIncrement變量,該變量表示當容量不夠時,容量自增的大小。app
其實二者在不少地方都是同樣的,然而在構造方法上面, Vector比 ArrayList多了一個方法:dom
1 public Vector(int initialCapacity, int capacityIncrement) { 2 super(); 3 if (initialCapacity < 0) 4 throw new IllegalArgumentException("Illegal Capacity: "+ 5 initialCapacity); 6 this.elementData = new Object[initialCapacity]; 7 this.capacityIncrement = capacityIncrement; 8 }
主要是由於 ArrayList中沒有 capacityIncrement這個變量, vector的這個構造方法,不只可以指定初始化容量,還能指定當容量不夠時,容量自增的大小。下面看擴容方法.函數
1 synchronized boolean add(E object) 2 void add(int location, E object) 3 synchronized boolean addAll(Collection<? extends E> collection) 4 synchronized boolean addAll(int location, Collection<? extends E> collection) 5 synchronized void addElement(E object) 6 synchronized int capacity() 7 void clear() 8 synchronized Object clone() 9 boolean contains(Object object) 10 synchronized boolean containsAll(Collection<?> collection) 11 synchronized void copyInto(Object[] elements) 12 synchronized E elementAt(int location) 13 Enumeration<E> elements() 14 synchronized void ensureCapacity(int minimumCapacity) 15 synchronized boolean equals(Object object) 16 synchronized E firstElement() 17 E get(int location) 18 synchronized int hashCode() 19 synchronized int indexOf(Object object, int location) 20 int indexOf(Object object) 21 synchronized void insertElementAt(E object, int location) 22 synchronized boolean isEmpty() 23 synchronized E lastElement() 24 synchronized int lastIndexOf(Object object, int location) 25 synchronized int lastIndexOf(Object object) 26 synchronized E remove(int location) 27 boolean remove(Object object) 28 synchronized boolean removeAll(Collection<?> collection) 29 synchronized void removeAllElements() 30 synchronized boolean removeElement(Object object) 31 synchronized void removeElementAt(int location) 32 synchronized boolean retainAll(Collection<?> collection) 33 synchronized E set(int location, E object) 34 synchronized void setElementAt(E object, int location) 35 synchronized void setSize(int length) 36 synchronized int size() 37 synchronized List<E> subList(int start, int end) 38 synchronized <T> T[] toArray(T[] contents) 39 synchronized Object[] toArray() 40 synchronized String toString() 41 synchronized void trimToSize()
爲了更瞭解Vector的原理,下面對Vector源碼代碼做出分析。this
1 package java.util; 2 public class Vector<E> 3 extends AbstractList<E> 4 implements List<E>, RandomAccess, Cloneable, java.io.Serializable 5 { 6 7 // 保存Vector中數據的數組 8 protected Object[] elementData; 9 // 實際數據的數量 10 protected int elementCount; 11 // 容量增加係數 12 protected int capacityIncrement; 13 // Vector的序列版本號 14 private static final long serialVersionUID = -2767605614048989439L; 15 // Vector構造函數。默認容量是10。 16 public Vector() { 17 this(10); 18 } 19 // 指定Vector容量大小的構造函數 20 public Vector(int initialCapacity) { 21 this(initialCapacity, 0); 22 } 23 // 指定Vector"容量大小"和"增加係數"的構造函數 24 public Vector(int initialCapacity, int capacityIncrement) { 25 super(); 26 if (initialCapacity < 0) 27 throw new IllegalArgumentException("Illegal Capacity: "+ 28 initialCapacity); 29 // 新建一個數組,數組容量是initialCapacity 30 this.elementData = new Object[initialCapacity]; 31 // 設置容量增加係數 32 this.capacityIncrement = capacityIncrement; 33 } 34 // 指定集合的Vector構造函數。 35 public Vector(Collection<? extends E> c) { 36 // 獲取「集合(c)」的數組,並將其賦值給elementData 37 elementData = c.toArray(); 38 // 設置數組長度 39 elementCount = elementData.length; 40 // c.toArray might (incorrectly) not return Object[] (see 6260652) 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 public synchronized void trimToSize() { 50 modCount++; 51 int oldCapacity = elementData.length; 52 if (elementCount < oldCapacity) { 53 elementData = Arrays.copyOf(elementData, elementCount); 54 } 55 } 56 // 確認「Vector容量」的幫助函數 57 private void ensureCapacityHelper(int minCapacity) { 58 int oldCapacity = elementData.length; 59 // 當Vector的容量不足以容納當前的所有元素,增長容量大小。 60 // 若 容量增量係數>0(即capacityIncrement>0),則將容量增大當capacityIncrement 61 // 不然,將容量增大一倍。 62 if (minCapacity > oldCapacity) { 63 Object[] oldData = elementData; 64 int newCapacity = (capacityIncrement > 0) ? 65 (oldCapacity + capacityIncrement) : (oldCapacity * 2); 66 if (newCapacity < minCapacity) { 67 newCapacity = minCapacity; 68 } 69 elementData = Arrays.copyOf(elementData, newCapacity); 70 } 71 } 72 // 肯定Vector的容量。 73 public synchronized void ensureCapacity(int minCapacity) { 74 // 將Vector的改變統計數+1 75 modCount++; 76 ensureCapacityHelper(minCapacity); 77 } 78 // 設置容量值爲 newSize 79 public synchronized void setSize(int newSize) { 80 modCount++; 81 if (newSize > elementCount) { 82 // 若 "newSize 大於 Vector容量",則調整Vector的大小。 83 ensureCapacityHelper(newSize); 84 } else { 85 // 若 "newSize 小於/等於 Vector容量",則將newSize位置開始的元素都設置爲null 86 for (int i = newSize ; i < elementCount ; i++) { 87 elementData[i] = null; 88 } 89 } 90 elementCount = newSize; 91 } 92 // 返回「Vector的總的容量」 93 public synchronized int capacity() { 94 return elementData.length; 95 } 96 // 返回「Vector的實際大小」,即Vector中元素個數 97 public synchronized int size() { 98 return elementCount; 99 } 100 // 判斷Vector是否爲空 101 public synchronized boolean isEmpty() { 102 return elementCount == 0; 103 } 104 // 返回「Vector中所有元素對應的Enumeration」 105 public Enumeration<E> elements() { 106 // 經過匿名類實現Enumeration 107 return new Enumeration<E>() { 108 int count = 0; 109 // 是否存在下一個元素 110 public boolean hasMoreElements() { 111 return count < elementCount; 112 } 113 // 獲取下一個元素 114 public E nextElement() { 115 synchronized (Vector.this) { 116 if (count < elementCount) { 117 return (E)elementData[count++]; 118 } 119 } 120 throw new NoSuchElementException("Vector Enumeration"); 121 } 122 }; 123 } 124 // 返回Vector中是否包含對象(o) 125 public boolean contains(Object o) { 126 return indexOf(o, 0) >= 0; 127 } 128 // 從index位置開始向後查找元素(o)。 129 // 若找到,則返回元素的索引值;不然,返回-1 130 public synchronized int indexOf(Object o, int index) { 131 if (o == null) { 132 // 若查找元素爲null,則正向找出null元素,並返回它對應的序號 133 for (int i = index ; i < elementCount ; i++) 134 if (elementData[i]==null) 135 return i; 136 } else { 137 // 若查找元素不爲null,則正向找出該元素,並返回它對應的序號 138 for (int i = index ; i < elementCount ; i++) 139 if (o.equals(elementData[i])) 140 return i; 141 } 142 return -1; 143 } 144 // 查找並返回元素(o)在Vector中的索引值 145 public int indexOf(Object o) { 146 return indexOf(o, 0); 147 } 148 // 從後向前查找元素(o)。並返回元素的索引 149 public synchronized int lastIndexOf(Object o) { 150 return lastIndexOf(o, elementCount-1); 151 } 152 // 從後向前查找元素(o)。開始位置是從前向後的第index個數; 153 // 若找到,則返回元素的「索引值」;不然,返回-1。 154 public synchronized int lastIndexOf(Object o, int index) { 155 if (index >= elementCount) 156 throw new IndexOutOfBoundsException(index + " >= "+ elementCount); 157 if (o == null) { 158 // 若查找元素爲null,則反向找出null元素,並返回它對應的序號 159 for (int i = index; i >= 0; i--) 160 if (elementData[i]==null) 161 return i; 162 } else { 163 // 若查找元素不爲null,則反向找出該元素,並返回它對應的序號 164 for (int i = index; i >= 0; i--) 165 if (o.equals(elementData[i])) 166 return i; 167 } 168 return -1; 169 } 170 // 返回Vector中index位置的元素。 171 // 若index月結,則拋出異常 172 public synchronized E elementAt(int index) { 173 if (index >= elementCount) { 174 throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); 175 } 176 return (E)elementData[index]; 177 } 178 // 獲取Vector中的第一個元素。 179 // 若失敗,則拋出異常! 180 public synchronized E firstElement() { 181 if (elementCount == 0) { 182 throw new NoSuchElementException(); 183 } 184 return (E)elementData[0]; 185 } 186 // 獲取Vector中的最後一個元素。 187 // 若失敗,則拋出異常! 188 public synchronized E lastElement() { 189 if (elementCount == 0) { 190 throw new NoSuchElementException(); 191 } 192 return (E)elementData[elementCount - 1]; 193 } 194 // 設置index位置的元素值爲obj 195 public synchronized void setElementAt(E obj, int index) { 196 if (index >= elementCount) { 197 throw new ArrayIndexOutOfBoundsException(index + " >= " + 198 elementCount); 199 } 200 elementData[index] = obj; 201 } 202 // 刪除index位置的元素 203 public synchronized void removeElementAt(int index) { 204 modCount++; 205 if (index >= elementCount) { 206 throw new ArrayIndexOutOfBoundsException(index + " >= " + 207 elementCount); 208 } else if (index < 0) { 209 throw new ArrayIndexOutOfBoundsException(index); 210 } 211 int j = elementCount - index - 1; 212 if (j > 0) { 213 System.arraycopy(elementData, index + 1, elementData, index, j); 214 } 215 elementCount--; 216 elementData[elementCount] = null; /* to let gc do its work */ 217 } 218 // 在index位置處插入元素(obj) 219 public synchronized void insertElementAt(E obj, int index) { 220 modCount++; 221 if (index > elementCount) { 222 throw new ArrayIndexOutOfBoundsException(index 223 + " > " + elementCount); 224 } 225 ensureCapacityHelper(elementCount + 1); 226 System.arraycopy(elementData, index, elementData, index + 1, elementCount - index); 227 elementData[index] = obj; 228 elementCount++; 229 } 230 // 將「元素obj」添加到Vector末尾 231 public synchronized void addElement(E obj) { 232 modCount++; 233 ensureCapacityHelper(elementCount + 1); 234 elementData[elementCount++] = obj; 235 } 236 // 在Vector中查找並刪除元素obj。 237 // 成功的話,返回true;不然,返回false。 238 public synchronized boolean removeElement(Object obj) { 239 modCount++; 240 int i = indexOf(obj); 241 if (i >= 0) { 242 removeElementAt(i); 243 return true; 244 } 245 return false; 246 } 247 // 刪除Vector中的所有元素 248 public synchronized void removeAllElements() { 249 modCount++; 250 // 將Vector中的所有元素設爲null 251 for (int i = 0; i < elementCount; i++) 252 elementData[i] = null; 253 elementCount = 0; 254 } 255 // 克隆函數 256 public synchronized Object clone() { 257 try { 258 Vector<E> v = (Vector<E>) super.clone(); 259 // 將當前Vector的所有元素拷貝到v中 260 v.elementData = Arrays.copyOf(elementData, elementCount); 261 v.modCount = 0; 262 return v; 263 } catch (CloneNotSupportedException e) { 264 // this shouldn't happen, since we are Cloneable 265 throw new InternalError(); 266 } 267 } 268 // 返回Object數組 269 public synchronized Object[] toArray() { 270 return Arrays.copyOf(elementData, elementCount); 271 } 272 // 返回Vector的模板數組。所謂模板數組,便可以將T設爲任意的數據類型 273 public synchronized <T> T[] toArray(T[] a) { 274 // 若數組a的大小 < Vector的元素個數; 275 // 則新建一個T[]數組,數組大小是「Vector的元素個數」,並將「Vector」所有拷貝到新數組中 276 if (a.length < elementCount) 277 return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass()); 278 // 若數組a的大小 >= Vector的元素個數; 279 // 則將Vector的所有元素都拷貝到數組a中。 280 System.arraycopy(elementData, 0, a, 0, elementCount); 281 if (a.length > elementCount) 282 a[elementCount] = null; 283 return a; 284 } 285 // 獲取index位置的元素 286 public synchronized E get(int index) { 287 if (index >= elementCount) 288 throw new ArrayIndexOutOfBoundsException(index); 289 return (E)elementData[index]; 290 } 291 // 設置index位置的值爲element。並返回index位置的原始值 292 public synchronized E set(int index, E element) { 293 if (index >= elementCount) 294 throw new ArrayIndexOutOfBoundsException(index); 295 Object oldValue = elementData[index]; 296 elementData[index] = element; 297 return (E)oldValue; 298 } 299 // 將「元素e」添加到Vector最後。 300 public synchronized boolean add(E e) { 301 modCount++; 302 ensureCapacityHelper(elementCount + 1); 303 elementData[elementCount++] = e; 304 return true; 305 } 306 // 刪除Vector中的元素o 307 public boolean remove(Object o) { 308 return removeElement(o); 309 } 310 // 在index位置添加元素element 311 public void add(int index, E element) { 312 insertElementAt(element, index); 313 } 314 // 刪除index位置的元素,並返回index位置的原始值 315 public synchronized E remove(int index) { 316 modCount++; 317 if (index >= elementCount) 318 throw new ArrayIndexOutOfBoundsException(index); 319 Object oldValue = elementData[index]; 320 int numMoved = elementCount - index - 1; 321 if (numMoved > 0) 322 System.arraycopy(elementData, index+1, elementData, index, 323 numMoved); 324 elementData[--elementCount] = null; // Let gc do its work 325 return (E)oldValue; 326 } 327 // 清空Vector 328 public void clear() { 329 removeAllElements(); 330 } 331 // 返回Vector是否包含集合c 332 public synchronized boolean containsAll(Collection<?> c) { 333 return super.containsAll(c); 334 } 335 // 將集合c添加到Vector中 336 public synchronized boolean addAll(Collection<? extends E> c) { 337 modCount++; 338 Object[] a = c.toArray(); 339 int numNew = a.length; 340 ensureCapacityHelper(elementCount + numNew); 341 // 將集合c的所有元素拷貝到數組elementData中 342 System.arraycopy(a, 0, elementData, elementCount, numNew); 343 elementCount += numNew; 344 return numNew != 0; 345 } 346 // 刪除集合c的所有元素 347 public synchronized boolean removeAll(Collection<?> c) { 348 return super.removeAll(c); 349 } 350 // 刪除「非集合c中的元素」 351 public synchronized boolean retainAll(Collection<?> c) { 352 return super.retainAll(c); 353 } 354 // 從index位置開始,將集合c添加到Vector中 355 public synchronized boolean addAll(int index, Collection<? extends E> c) { 356 modCount++; 357 if (index < 0 || index > elementCount) 358 throw new ArrayIndexOutOfBoundsException(index); 359 Object[] a = c.toArray(); 360 int numNew = a.length; 361 ensureCapacityHelper(elementCount + numNew); 362 int numMoved = elementCount - index; 363 if (numMoved > 0) 364 System.arraycopy(elementData, index, elementData, index + numNew, numMoved); 365 System.arraycopy(a, 0, elementData, index, numNew); 366 elementCount += numNew; 367 return numNew != 0; 368 } 369 // 返回兩個對象是否相等 370 public synchronized boolean equals(Object o) { 371 return super.equals(o); 372 } 373 // 計算哈希值 374 public synchronized int hashCode() { 375 return super.hashCode(); 376 } 377 // 調用父類的toString() 378 public synchronized String toString() { 379 return super.toString(); 380 } 381 // 獲取Vector中fromIndex(包括)到toIndex(不包括)的子集 382 public synchronized List<E> subList(int fromIndex, int toIndex) { 383 return Collections.synchronizedList(super.subList(fromIndex, toIndex), this); 384 } 385 // 刪除Vector中fromIndex到toIndex的元素 386 protected synchronized void removeRange(int fromIndex, int toIndex) { 387 modCount++; 388 int numMoved = elementCount - toIndex; 389 System.arraycopy(elementData, toIndex, elementData, fromIndex, 390 numMoved); 391 // Let gc do its work 392 int newElementCount = elementCount - (toIndex-fromIndex); 393 while (elementCount != newElementCount) 394 elementData[--elementCount] = null; 395 } 396 // java.io.Serializable的寫入函數 397 private synchronized void writeObject(java.io.ObjectOutputStream s) 398 throws java.io.IOException { 399 s.defaultWriteObject(); 400 } 401 }
總結:
(01) Vector其實是經過一個數組去保存數據的。當咱們構造Vecotr時;若使用默認構造函數,則Vector的默認容量大小是10。
(02) 當Vector容量不足以容納所有元素時,Vector的容量會增長。若容量增長係數 >0,則將容量的值增長「容量增長係數」;不然,將容量大小增長一倍。
(03) Vector的克隆函數,便是將所有元素克隆到一個數組中。
第3部分 Vector遍歷方式
Vector支持4種遍歷方式。建議使用下面的第二種去遍歷Vector,由於效率問題。spa
1 (01) 第一種,經過迭代器遍歷。即經過Iterator去遍歷。 2 Integer value = null; 3 int size = vec.size(); 4 for (int i=0; i<size; i++) { 5 value = (Integer)vec.get(i); 6 } 7 (02) 第二種,隨機訪問,經過索引值去遍歷。 8 因爲Vector實現了RandomAccess接口,它支持經過索引值去隨機訪問元素。 9 Integer value = null; 10 int size = vec.size(); 11 for (int i=0; i<size; i++) { 12 value = (Integer)vec.get(i); 13 } 14 (03) 第三種,另外一種for循環。以下: 15 Integer value = null; 16 for (Integer integ:vec) { 17 value = integ; 18 } 19 (04) 第四種,Enumeration遍歷。以下: 20 Integer value = null; 21 Enumeration enu = vec.elements(); 22 while (enu.hasMoreElements()) { 23 value = (Integer)enu.nextElement(); 24 } 25