您的当前位置:首页>新品 > 正文

【源代码】java.util.Vector容器源代码详解

来源:CSDN 时间:2023-02-08 10:27:22

这里列出java.util.Vector容器的源代码。

Vector类型声明:


(相关资料图)

public class Vectorextends AbstractList

接口实现:

implements List, RandomAccess, Cloneable, Serializable

实现了随意读取,可复制和可序列化接口

成员变量定义:

private static final long serialVersionUID = -2767605614048989439L;protected T[] elementData;protected int elementCount;protected int capacityIncrement;

其中,T[] elementData是Vector存储的核心,为一个泛型数组。另外有一个标志容量的变量elementCount,另一个capacityIncrement是用来表征数组elementData扩容是的增量。

Vector容器总共有四个构造函数

133:   public Vector(Collection c) 134:   { 135:     elementCount = c.size(); 136:     elementData = c.toArray((T[]) new Object[elementCount]); 137:   }

如上是根据另一个容器来构造Vector容器。

148:   public Vector(int initialCapacity, int capacityIncrement) 149:   { 150:     if (initialCapacity < 0) 151:       throw new IllegalArgumentException(); 152:     elementData = (T[]) new Object[initialCapacity]; 153:     this.capacityIncrement = capacityIncrement; 154:   }

通过初始化elementData大小和增量来初始化Vector。

163:   public Vector(int initialCapacity) 164:   { 165:     this(initialCapacity, 0); 166:   }

通过初始化elementData容量来初始化Vector,其中增量默认为0.

120:   public Vector() 121:   { 122:     this(10, 0); 123:   }

最后一个构造函数最直接了当,初始化容量10,增量为0。

然后Vector定义两个修改elementData数组的成员函数,一个负责拷贝,一个负责压缩。

179:   public synchronized void copyInto(Object[] a) 180:   { 181:     System.arraycopy(elementData, 0, a, 0, elementCount); 182:   } 189:   public synchronized void trimToSize() 190:   { 195:     T[] newArray = (T[]) new Object[elementCount]; 196:     System.arraycopy(elementData, 0, newArray, 0, elementCount); 197:     elementData = newArray; 198:   }

两个函数都是将现有数组复制到新的数组来实现扩容或压缩。

每当Vector有新元素添加时,需要检测当前elementData是否已满,这个函数如下,同时ensureCapacity还会将数组进行扩容:

210:   public synchronized void ensureCapacity(int minCapacity) 211:   { 212:     if (elementData.length >= minCapacity) 213:       return; 214:  215:     int newCapacity; 216:     if (capacityIncrement <= 0) 217:       newCapacity = elementData.length * 2; 218:     else 219:       newCapacity = elementData.length + capacityIncrement; 220:  221:     T[] newArray = (T[]) new Object[Math.max(newCapacity, minCapacity)]; 222:  223:     System.arraycopy(elementData, 0, newArray, 0, elementCount); 224:     elementData = newArray; 225:   }

如果需要给数组制定一个新的长度可以使用setSize()方法。

236:   public synchronized void setSize(int newSize) 237:   { 241:     modCount++; 242:     ensureCapacity(newSize); 243:     if (newSize < elementCount) 244:       Arrays.fill(elementData, newSize, elementCount, null); 245:     elementCount = newSize; 246:   }

Vector提供一个迭代器来遍历数组:

287:   public Enumerationelements() 288:   { 289:     return new Enumeration() 290:     { 291:       private int i = 0; 292:  293:       public boolean hasMoreElements() 294:       { 295:         return i < elementCount; 296:       } 297:  298:       public T nextElement() 299:       { 300:         if (i >= elementCount) 301:           throw new NoSuchElementException(); 302:         return elementData[i++]; 303:       } 304:     }; 305:   }

添加元素:

622:   public boolean add(T o) 623:   { 624:     addElement(o); 625:     return true; 626:   }

其中添加方法定义如下:

475:   public synchronized void addElement(T obj) 476:   { 477:     if (elementCount == elementData.length) 478:       ensureCapacity(elementCount + 1); 479:     modCount++; 480:     elementData[elementCount++] = obj; 481:   }

同时Vector支持插入操作:

650:   public void add(int index, T element) 651:   { 652:     insertElementAt(element, index); 653:   }

在添加时加入添加位置,其中插入值方法定义如下:

457:   public synchronized void insertElementAt(T obj, int index) 458:   { 459:     checkBoundInclusive(index); 460:     if (elementCount == elementData.length) 461:       ensureCapacity(elementCount + 1); 462:     modCount++; 463:     System.arraycopy(elementData, index, elementData, index + 1, 464:                      elementCount - index); 465:     elementCount++; 466:     elementData[index] = obj; 467:   }

同时也可以将一个容器直接添加到Vector中:

786:   public synchronized boolean addAll(int index, Collection c) 787:   { 788:     checkBoundInclusive(index); 789:     Iterator itr = c.iterator(); 790:     int csize = c.size(); 791:  792:     modCount++; 793:     ensureCapacity(elementCount + csize); 794:     int end = index + csize; 795:     if (elementCount > 0 && index != elementCount) 796:       System.arraycopy(elementData, index, 797:                elementData, end, elementCount - index); 798:     elementCount += csize; 799:     for ( ; index < end; index++) 800:       elementData[index] = itr.next(); 801:     return (csize > 0); 802:   }

Vector中获取制定索引的方法为:

592:   public T get(int index) 593:   { 594:     return elementAt(index); 595:   }

其实可以直接调用:

388:   public synchronized T elementAt(int index) 389:   { 390:     checkBoundExclusive(index); 391:     return elementData[index]; 392:   }

修改索引值得方法:

430:   public void setElementAt(T obj, int index) 431:   { 432:     set(index, obj); 433:   }

其中set()方法定义如下:

607:   public synchronized T set(int index, T element) 608:   { 609:     checkBoundExclusive(index); 610:     T temp = elementData[index]; 611:     elementData[index] = element; 612:     return temp; 613:   }

清除元素:

679:   public void clear() 680:   { 681:     removeAllElements(); 682:   }

其中removeAllElements()方法定义如下:

509:   public synchronized void removeAllElements() 510:   { 511:     if (elementCount == 0) 512:       return; 513:  514:     modCount++; 515:     Arrays.fill(elementData, 0, elementCount, null); 516:     elementCount = 0; 517:   }

Vector容器支持复制:

525:   public synchronized Object clone() 526:   { 527:     try 528:       { 529:         Vector clone = (Vector) super.clone(); 530:         clone.elementData = (Object[]) elementData.clone(); 531:         return clone; 532:       } 533:     catch (CloneNotSupportedException ex) 534:       { 535:         // Impossible to get here. 536:         throw new InternalError(ex.toString()); 537:       } 538:   }

这是一个深度复制,其中对elementData数组进行了新建。

Vector可以以数组形式输出一个给定数组中:

573:   public synchronized  S[] toArray(S[] a) 574:   { 575:     if (a.length < elementCount) 576:       a = (S[]) Array.newInstance(a.getClass().getComponentType(), 577:                   elementCount); 578:     else if (a.length > elementCount) 579:       a[elementCount] = null; 580:     System.arraycopy(elementData, 0, a, 0, elementCount); 581:     return a; 582:   }

Vector也支持截取一段子列表:

860:   public synchronized ListsubList(int fromIndex, int toIndex) 861:   { 862:     Listsub = super.subList(fromIndex, toIndex); 865:     return new Collections.SynchronizedList(this, sub); 866:   }

同时也可以移除一段范围内的子数组:

878:   protected void removeRange(int fromIndex, int toIndex) 879:   { 880:     int change = toIndex - fromIndex; 881:     if (change > 0) 882:       { 883:         modCount++; 884:         System.arraycopy(elementData, toIndex, elementData, fromIndex, 885:                          elementCount - toIndex); 886:         int save = elementCount; 887:         elementCount -= change; 888:         Arrays.fill(elementData, elementCount, save, null); 889:       } 890:     else if (change < 0) 891:       throw new IndexOutOfBoundsException(); 892:   }

序列化Vector只需要调用如下方法即可:

931:   private synchronized void writeObject(ObjectOutputStream s) 932:     throws IOException 933:   { 934:     s.defaultWriteObject(); 935:   }

如下提供完整源代码供浏览。

源代码

源代码来源:http://developer.classpath.org/doc/java/util/Vector-source.html

1: /* Vector.java -- Class that provides growable arrays.   2:    Copyright (C) 1998, 1999, 2000, 2001, 2004, 2005, 2006,     3:    Free Software Foundation, Inc.   4:    5: This file is part of GNU Classpath.   6:    7: GNU Classpath is free software; you can redistribute it and/or modify   8: it under the terms of the GNU General Public License as published by   9: the Free Software Foundation; either version 2, or (at your option)  10: any later version.  11:   12: GNU Classpath is distributed in the hope that it will be useful, but  13: WITHOUT ANY WARRANTY; without even the implied warranty of  14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  15: General Public License for more details.  16:   17: You should have received a copy of the GNU General Public License  18: along with GNU Classpath; see the file COPYING.  If not, write to the  19: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  20: 02110-1301 USA.  21:   22: Linking this library statically or dynamically with other modules is  23: making a combined work based on this library.  Thus, the terms and  24: conditions of the GNU General Public License cover the whole  25: combination.  26:   27: As a special exception, the copyright holders of this library give you  28: permission to link this library with independent modules to produce an  29: executable, regardless of the license terms of these independent  30: modules, and to copy and distribute the resulting executable under  31: terms of your choice, provided that you also meet, for each linked  32: independent module, the terms and conditions of the license of that  33: module.  An independent module is a module which is not derived from  34: or based on this library.  If you modify this library, you may extend  35: this exception to your version of the library, but you are not  36: obligated to do so.  If you do not wish to do so, delete this  37: exception statement from your version. */  38:   39:   40: package java.util;  41:   42: import java.io.IOException;  43: import java.io.ObjectOutputStream;  44: import java.io.Serializable;  45: import java.lang.reflect.Array;  46:   47: /**  48:  * The Vector classes implements growable arrays of Objects.  49:  * You can access elements in a Vector with an index, just as you  50:  * can in a built in array, but Vectors can grow and shrink to accommodate  51:  * more or fewer objects.52:  *  53:  * Vectors try to mantain efficiency in growing by having a  54:  * capacityIncrement that can be specified at instantiation.  55:  * When a Vector can no longer hold a new Object, it grows by the amount  56:  * in capacityIncrement. If this value is 0, the vector doubles in  57:  * size.58:  *  59:  * Vector implements the JDK 1.2 List interface, and is therefore a fully  60:  * compliant Collection object. The iterators are fail-fast - if external  61:  * code structurally modifies the vector, any operation on the iterator will  62:  * then throw a {@link ConcurrentModificationException}. The Vector class is  63:  * fully synchronized, but the iterators are not. So, when iterating over a  64:  * vector, be sure to synchronize on the vector itself.  If you don"t want the  65:  * expense of synchronization, use ArrayList instead. On the other hand, the  66:  * Enumeration of elements() is not thread-safe, nor is it fail-fast; so it  67:  * can lead to undefined behavior even in a single thread if you modify the  68:  * vector during iteration.69:  *  70:  * Note: Some methods, especially those specified by List, specify throwing  71:  * {@link IndexOutOfBoundsException}, but it is easier to implement by  72:  * throwing the subclass {@link ArrayIndexOutOfBoundsException}. Others  73:  * directly specify this subclass.  74:  *  75:  * @author Scott G. Miller  76:  * @author Bryce McKinlay  77:  * @author Eric Blake (ebb9@email.byu.edu)  78:  * @see Collection  79:  * @see List  80:  * @see ArrayList  81:  * @see LinkedList  82:  * @since 1.0  83:  * @status updated to 1.4  84:  */  85: public class Vectorextends AbstractList86:   implements List, RandomAccess, Cloneable, Serializable  87: {  88:   /**  89:    * Compatible with JDK 1.0+.  90:    */  91:   private static final long serialVersionUID = -2767605614048989439L;  92:   93:   /**  94:    * The internal array used to hold members of a Vector. The elements are  95:    * in positions 0 through elementCount - 1, and all remaining slots are null.  96:    * @serial the elements  97:    */  98:   protected T[] elementData;  99:  100:   /** 101:    * The number of elements currently in the vector, also returned by 102:    * {@link #size}. 103:    * @serial the size 104:    */ 105:   protected int elementCount; 106:  107:   /** 108:    * The amount the Vector"s internal array should be increased in size when 109:    * a new element is added that exceeds the current size of the array, 110:    * or when {@link #ensureCapacity} is called. If <= 0, the vector just 111:    * doubles in size. 112:    * @serial the amount to grow the vector by 113:    */ 114:   protected int capacityIncrement; 115:  116:   /** 117:    * Constructs an empty vector with an initial size of 10, and 118:    * a capacity increment of 0 119:    */ 120:   public Vector() 121:   { 122:     this(10, 0); 123:   } 124:  125:   /** 126:    * Constructs a vector containing the contents of Collection, in the 127:    * order given by the collection. 128:    * 129:    * @param c collection of elements to add to the new vector 130:    * @throws NullPointerException if c is null 131:    * @since 1.2 132:    */ 133:   public Vector(Collection c) 134:   { 135:     elementCount = c.size(); 136:     elementData = c.toArray((T[]) new Object[elementCount]); 137:   } 138:  139:   /** 140:    * Constructs a Vector with the initial capacity and capacity 141:    * increment specified. 142:    * 143:    * @param initialCapacity the initial size of the Vector"s internal array 144:    * @param capacityIncrement the amount the internal array should be 145:    *        increased by when necessary, 0 to double the size 146:    * @throws IllegalArgumentException if initialCapacity < 0 147:    */ 148:   public Vector(int initialCapacity, int capacityIncrement) 149:   { 150:     if (initialCapacity < 0) 151:       throw new IllegalArgumentException(); 152:     elementData = (T[]) new Object[initialCapacity]; 153:     this.capacityIncrement = capacityIncrement; 154:   } 155:  156:   /** 157:    * Constructs a Vector with the initial capacity specified, and a capacity 158:    * increment of 0 (double in size). 159:    * 160:    * @param initialCapacity the initial size of the Vector"s internal array 161:    * @throws IllegalArgumentException if initialCapacity < 0 162:    */ 163:   public Vector(int initialCapacity) 164:   { 165:     this(initialCapacity, 0); 166:   } 167:  168:   /** 169:    * Copies the contents of the Vector into the provided array.  If the 170:    * array is too small to fit all the elements in the Vector, an  171:    * {@link IndexOutOfBoundsException} is thrown without modifying the array.   172:    * Old elements in the array are overwritten by the new elements. 173:    * 174:    * @param a target array for the copy 175:    * @throws IndexOutOfBoundsException the array is not large enough 176:    * @throws NullPointerException the array is null 177:    * @see #toArray(Object[]) 178:    */ 179:   public synchronized void copyInto(Object[] a) 180:   { 181:     System.arraycopy(elementData, 0, a, 0, elementCount); 182:   } 183:  184:   /** 185:    * Trims the Vector down to size.  If the internal data array is larger 186:    * than the number of Objects its holding, a new array is constructed 187:    * that precisely holds the elements. Otherwise this does nothing. 188:    */ 189:   public synchronized void trimToSize() 190:   { 191:     // Don"t bother checking for the case where size() == the capacity of the 192:     // vector since that is a much less likely case; it"s more efficient to 193:     // not do the check and lose a bit of performance in that infrequent case 194:  195:     T[] newArray = (T[]) new Object[elementCount]; 196:     System.arraycopy(elementData, 0, newArray, 0, elementCount); 197:     elementData = newArray; 198:   } 199:  200:   /** 201:    * Ensures that minCapacity elements can fit within this Vector. 202:    * If elementData is too small, it is expanded as follows: 203:    * If the elementCount + capacityIncrement is adequate, that 204:    * is the new size. If capacityIncrement is non-zero, the 205:    * candidate size is double the current. If that is not enough, the new 206:    * size is minCapacity. 207:    * 208:    * @param minCapacity the desired minimum capacity, negative values ignored 209:    */ 210:   public synchronized void ensureCapacity(int minCapacity) 211:   { 212:     if (elementData.length >= minCapacity) 213:       return; 214:  215:     int newCapacity; 216:     if (capacityIncrement <= 0) 217:       newCapacity = elementData.length * 2; 218:     else 219:       newCapacity = elementData.length + capacityIncrement; 220:  221:     T[] newArray = (T[]) new Object[Math.max(newCapacity, minCapacity)]; 222:  223:     System.arraycopy(elementData, 0, newArray, 0, elementCount); 224:     elementData = newArray; 225:   } 226:  227:   /** 228:    * Explicitly sets the size of the vector (but not necessarily the size of 229:    * the internal data array). If the new size is smaller than the old one, 230:    * old values that don"t fit are lost. If the new size is larger than the 231:    * old one, the vector is padded with null entries. 232:    * 233:    * @param newSize The new size of the internal array 234:    * @throws ArrayIndexOutOfBoundsException if the new size is negative 235:    */ 236:   public synchronized void setSize(int newSize) 237:   { 238:     // Don"t bother checking for the case where size() == the capacity of the 239:     // vector since that is a much less likely case; it"s more efficient to 240:     // not do the check and lose a bit of performance in that infrequent case 241:     modCount++; 242:     ensureCapacity(newSize); 243:     if (newSize < elementCount) 244:       Arrays.fill(elementData, newSize, elementCount, null); 245:     elementCount = newSize; 246:   } 247:  248:   /** 249:    * Returns the size of the internal data array (not the amount of elements 250:    * contained in the Vector). 251:    * 252:    * @return capacity of the internal data array 253:    */ 254:   public synchronized int capacity() 255:   { 256:     return elementData.length; 257:   } 258:  259:   /** 260:    * Returns the number of elements stored in this Vector. 261:    * 262:    * @return the number of elements in this Vector 263:    */ 264:   public synchronized int size() 265:   { 266:     return elementCount; 267:   } 268:  269:   /** 270:    * Returns true if this Vector is empty, false otherwise 271:    * 272:    * @return true if the Vector is empty, false otherwise 273:    */ 274:   public synchronized boolean isEmpty() 275:   { 276:     return elementCount == 0; 277:   } 278:  279:   /** 280:    * Returns an Enumeration of the elements of this Vector. The enumeration 281:    * visits the elements in increasing index order, but is NOT thread-safe. 282:    * 283:    * @return an Enumeration 284:    * @see #iterator() 285:    */ 286:   // No need to synchronize as the Enumeration is not thread-safe! 287:   public Enumerationelements() 288:   { 289:     return new Enumeration() 290:     { 291:       private int i = 0; 292:  293:       public boolean hasMoreElements() 294:       { 295:         return i < elementCount; 296:       } 297:  298:       public T nextElement() 299:       { 300:         if (i >= elementCount) 301:           throw new NoSuchElementException(); 302:         return elementData[i++]; 303:       } 304:     }; 305:   } 306:  307:   /** 308:    * Returns true when elem is contained in this Vector. 309:    * 310:    * @param elem the element to check 311:    * @return true if the object is contained in this Vector, false otherwise 312:    */ 313:   public boolean contains(Object elem) 314:   { 315:     return indexOf(elem, 0) >= 0; 316:   } 317:  318:   /** 319:    * Returns the first occurrence of elem in the Vector, or -1 if 320:    * elem is not found. 321:    * 322:    * @param elem the object to search for 323:    * @return the index of the first occurrence, or -1 if not found 324:    */ 325:   public int indexOf(Object elem) 326:   { 327:     return indexOf(elem, 0); 328:   } 329:  330:   /** 331:    * Searches the vector starting at index for object 332:    * elem and returns the index of the first occurrence of this 333:    * Object.  If the object is not found, or index is larger than the size 334:    * of the vector, -1 is returned. 335:    * 336:    * @param e the Object to search for 337:    * @param index start searching at this index 338:    * @return the index of the next occurrence, or -1 if it is not found 339:    * @throws IndexOutOfBoundsException if index < 0 340:    */ 341:   public synchronized int indexOf(Object e, int index) 342:   { 343:     for (int i = index; i < elementCount; i++) 344:       if (equals(e, elementData[i])) 345:         return i; 346:     return -1; 347:   } 348:  349:   /** 350:    * Returns the last index of elem within this Vector, or -1 351:    * if the object is not within the Vector. 352:    * 353:    * @param elem the object to search for 354:    * @return the last index of the object, or -1 if not found 355:    */ 356:   public int lastIndexOf(Object elem) 357:   { 358:     return lastIndexOf(elem, elementCount - 1); 359:   } 360:  361:   /** 362:    * Returns the index of the first occurrence of elem, when 363:    * searching backwards from index.  If the object does not 364:    * occur in this Vector, or index is less than 0, -1 is returned. 365:    * 366:    * @param e the object to search for 367:    * @param index the index to start searching in reverse from 368:    * @return the index of the Object if found, -1 otherwise 369:    * @throws IndexOutOfBoundsException if index >= size() 370:    */ 371:   public synchronized int lastIndexOf(Object e, int index) 372:   { 373:     checkBoundExclusive(index); 374:     for (int i = index; i >= 0; i--) 375:       if (equals(e, elementData[i])) 376:         return i; 377:     return -1; 378:   } 379:  380:   /** 381:    * Returns the Object stored at index. 382:    * 383:    * @param index the index of the Object to retrieve 384:    * @return the object at index 385:    * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size() 386:    * @see #get(int) 387:    */ 388:   public synchronized T elementAt(int index) 389:   { 390:     checkBoundExclusive(index); 391:     return elementData[index]; 392:   } 393:  394:   /** 395:    * Returns the first element (index 0) in the Vector. 396:    * 397:    * @return the first Object in the Vector 398:    * @throws NoSuchElementException the Vector is empty 399:    */ 400:   public synchronized T firstElement() 401:   { 402:     if (elementCount == 0) 403:       throw new NoSuchElementException(); 404:  405:     return elementData[0]; 406:   } 407:  408:   /** 409:    * Returns the last element in the Vector. 410:    * 411:    * @return the last Object in the Vector 412:    * @throws NoSuchElementException the Vector is empty 413:    */ 414:   public synchronized T lastElement() 415:   { 416:     if (elementCount == 0) 417:       throw new NoSuchElementException(); 418:  419:     return elementData[elementCount - 1]; 420:   } 421:  422:   /** 423:    * Changes the element at index to be obj 424:    * 425:    * @param obj the object to store 426:    * @param index the position in the Vector to store the object 427:    * @throws ArrayIndexOutOfBoundsException the index is out of range 428:    * @see #set(int, Object) 429:    */ 430:   public void setElementAt(T obj, int index) 431:   { 432:     set(index, obj); 433:   } 434:  435:   /** 436:    * Removes the element at index, and shifts all elements at 437:    * positions greater than index to their index - 1. 438:    * 439:    * @param index the index of the element to remove 440:    * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size(); 441:    * @see #remove(int) 442:    */ 443:   public void removeElementAt(int index) 444:   { 445:     remove(index); 446:   } 447:  448:   /** 449:    * Inserts a new element into the Vector at index.  Any elements 450:    * at or greater than index are shifted up one position. 451:    * 452:    * @param obj the object to insert 453:    * @param index the index at which the object is inserted 454:    * @throws ArrayIndexOutOfBoundsException index < 0 || index > size() 455:    * @see #add(int, Object) 456:    */ 457:   public synchronized void insertElementAt(T obj, int index) 458:   { 459:     checkBoundInclusive(index); 460:     if (elementCount == elementData.length) 461:       ensureCapacity(elementCount + 1); 462:     modCount++; 463:     System.arraycopy(elementData, index, elementData, index + 1, 464:                      elementCount - index); 465:     elementCount++; 466:     elementData[index] = obj; 467:   } 468:  469:   /** 470:    * Adds an element to the Vector at the end of the Vector.  The vector 471:    * is increased by ensureCapacity(size() + 1) if needed. 472:    * 473:    * @param obj the object to add to the Vector 474:    */ 475:   public synchronized void addElement(T obj) 476:   { 477:     if (elementCount == elementData.length) 478:       ensureCapacity(elementCount + 1); 479:     modCount++; 480:     elementData[elementCount++] = obj; 481:   } 482:  483:   /** 484:    * Removes the first (the lowest index) occurrence of the given object from 485:    * the Vector. If such a remove was performed (the object was found), true 486:    * is returned. If there was no such object, false is returned. 487:    * 488:    * @param obj the object to remove from the Vector 489:    * @return true if the Object was in the Vector, false otherwise 490:    * @see #remove(Object) 491:    */ 492:   public synchronized boolean removeElement(Object obj) 493:   { 494:     int idx = indexOf(obj, 0); 495:     if (idx >= 0) 496:       { 497:         remove(idx); 498:         return true; 499:       } 500:     return false; 501:   } 502:  503:   /** 504:    * Removes all elements from the Vector.  Note that this does not 505:    * resize the internal data array. 506:    * 507:    * @see #clear() 508:    */ 509:   public synchronized void removeAllElements() 510:   { 511:     if (elementCount == 0) 512:       return; 513:  514:     modCount++; 515:     Arrays.fill(elementData, 0, elementCount, null); 516:     elementCount = 0; 517:   } 518:  519:   /** 520:    * Creates a new Vector with the same contents as this one. The clone is 521:    * shallow; elements are not cloned. 522:    * 523:    * @return the clone of this vector 524:    */ 525:   public synchronized Object clone() 526:   { 527:     try 528:       { 529:         Vector clone = (Vector) super.clone(); 530:         clone.elementData = (Object[]) elementData.clone(); 531:         return clone; 532:       } 533:     catch (CloneNotSupportedException ex) 534:       { 535:         // Impossible to get here. 536:         throw new InternalError(ex.toString()); 537:       } 538:   } 539:  540:   /** 541:    * Returns an Object array with the contents of this Vector, in the order 542:    * they are stored within this Vector.  Note that the Object array returned 543:    * is not the internal data array, and that it holds only the elements 544:    * within the Vector.  This is similar to creating a new Object[] with the 545:    * size of this Vector, then calling Vector.copyInto(yourArray). 546:    * 547:    * @return an Object[] containing the contents of this Vector in order 548:    * @since 1.2 549:    */ 550:   public synchronized Object[] toArray() 551:   { 552:     Object[] newArray = new Object[elementCount]; 553:     copyInto(newArray); 554:     return newArray; 555:   } 556:  557:   /** 558:    * Returns an array containing the contents of this Vector. 559:    * If the provided array is large enough, the contents are copied 560:    * into that array, and a null is placed in the position size(). 561:    * In this manner, you can obtain the size of a Vector by the position 562:    * of the null element, if you know the vector does not itself contain 563:    * null entries.  If the array is not large enough, reflection is used 564:    * to create a bigger one of the same runtime type. 565:    * 566:    * @param a an array to copy the Vector into if large enough 567:    * @return an array with the contents of this Vector in order 568:    * @throws ArrayStoreException the runtime type of the provided array 569:    *         cannot hold the elements of the Vector 570:    * @throws NullPointerException if a is null 571:    * @since 1.2 572:    */ 573:   public synchronized  S[] toArray(S[] a) 574:   { 575:     if (a.length < elementCount) 576:       a = (S[]) Array.newInstance(a.getClass().getComponentType(), 577:                   elementCount); 578:     else if (a.length > elementCount) 579:       a[elementCount] = null; 580:     System.arraycopy(elementData, 0, a, 0, elementCount); 581:     return a; 582:   } 583:  584:   /** 585:    * Returns the element at position index. 586:    * 587:    * @param index the position from which an element will be retrieved 588:    * @return the element at that position 589:    * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size() 590:    * @since 1.2 591:    */ 592:   public T get(int index) 593:   { 594:     return elementAt(index); 595:   } 596:  597:   /** 598:    * Puts element into the Vector at position index 599:    * and returns the Object that previously occupied that position. 600:    * 601:    * @param index the index within the Vector to place the Object 602:    * @param element the Object to store in the Vector 603:    * @return the previous object at the specified index 604:    * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size() 605:    * @since 1.2 606:    */ 607:   public synchronized T set(int index, T element) 608:   { 609:     checkBoundExclusive(index); 610:     T temp = elementData[index]; 611:     elementData[index] = element; 612:     return temp; 613:   } 614:  615:   /** 616:    * Adds an object to the Vector. 617:    * 618:    * @param o the element to add to the Vector 619:    * @return true, as specified by List 620:    * @since 1.2 621:    */ 622:   public boolean add(T o) 623:   { 624:     addElement(o); 625:     return true; 626:   } 627:  628:   /** 629:    * Removes the given Object from the Vector.  If it exists, true 630:    * is returned, if not, false is returned. 631:    * 632:    * @param o the object to remove from the Vector 633:    * @return true if the Object existed in the Vector, false otherwise 634:    * @since 1.2 635:    */ 636:   public boolean remove(Object o) 637:   { 638:     return removeElement(o); 639:   } 640:  641:   /** 642:    * Adds an object at the specified index.  Elements at or above 643:    * index are shifted up one position. 644:    * 645:    * @param index the index at which to add the element 646:    * @param element the element to add to the Vector 647:    * @throws ArrayIndexOutOfBoundsException index < 0 || index > size() 648:    * @since 1.2 649:    */ 650:   public void add(int index, T element) 651:   { 652:     insertElementAt(element, index); 653:   } 654:  655:   /** 656:    * Removes the element at the specified index, and returns it. 657:    * 658:    * @param index the position from which to remove the element 659:    * @return the object removed 660:    * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size() 661:    * @since 1.2 662:    */ 663:   public synchronized T remove(int index) 664:   { 665:     checkBoundExclusive(index); 666:     T temp = elementData[index]; 667:     modCount++; 668:     elementCount--; 669:     if (index < elementCount) 670:       System.arraycopy(elementData, index + 1, elementData, index, 671:                        elementCount - index); 672:     elementData[elementCount] = null; 673:     return temp; 674:   } 675:  676:   /** 677:    * Clears all elements in the Vector and sets its size to 0. 678:    */ 679:   public void clear() 680:   { 681:     removeAllElements(); 682:   } 683:  684:   /** 685:    * Returns true if this Vector contains all the elements in c. 686:    * 687:    * @param c the collection to compare to 688:    * @return true if this vector contains all elements of c 689:    * @throws NullPointerException if c is null 690:    * @since 1.2 691:    */ 692:   public synchronized boolean containsAll(Collection c) 693:   { 694:     // Here just for the sychronization. 695:     return super.containsAll(c); 696:   } 697:  698:   /** 699:    * Appends all elements of the given collection to the end of this Vector. 700:    * Behavior is undefined if the collection is modified during this operation 701:    * (for example, if this == c). 702:    * 703:    * @param c the collection to append 704:    * @return true if this vector changed, in other words c was not empty 705:    * @throws NullPointerException if c is null 706:    * @since 1.2 707:    */ 708:   public synchronized boolean addAll(Collection c) 709:   { 710:     return addAll(elementCount, c); 711:   } 712:  713:   /** 714:    * Remove from this vector all elements contained in the given collection. 715:    * 716:    * @param c the collection to filter out 717:    * @return true if this vector changed 718:    * @throws NullPointerException if c is null 719:    * @since 1.2 720:    */ 721:   public synchronized boolean removeAll(Collection c) 722:   { 723:     // The NullPointerException is thrown implicitly when the Vector 724:     // is not empty and c is null. The RI allows null arguments when 725:     // the vector is empty. See Mauve test: 726:     // gnu/testlet/java/util/Vector/removeAll.java 727:  728:     int i; 729:     int j; 730:     for (i = 0; i < elementCount; i++) 731:       if (c.contains(elementData[i])) 732:         break; 733:     if (i == elementCount) 734:       return false; 735:  736:     modCount++; 737:     for (j = i++; i < elementCount; i++) 738:       if (! c.contains(elementData[i])) 739:         elementData[j++] = elementData[i]; 740:     elementCount -= i - j; 741:     return true; 742:   } 743:  744:   /** 745:    * Retain in this vector only the elements contained in the given collection. 746:    * 747:    * @param c the collection to filter by 748:    * @return true if this vector changed 749:    * @throws NullPointerException if c is null 750:    * @since 1.2 751:    */ 752:   public synchronized boolean retainAll(Collection c) 753:   { 754:     // The NullPointerException is thrown implicitly when the Vector 755:     // is not empty and c is null. The RI allows null arguments when 756:     // the vector is empty. See Mauve test: 757:     // gnu/testlet/java/util/Vector/retainAll.java 758:  759:     int i; 760:     int j; 761:     for (i = 0; i < elementCount; i++) 762:       if (! c.contains(elementData[i])) 763:         break; 764:     if (i == elementCount) 765:       return false; 766:  767:     modCount++; 768:     for (j = i++; i < elementCount; i++) 769:       if (c.contains(elementData[i])) 770:         elementData[j++] = elementData[i]; 771:     elementCount -= i - j; 772:     return true; 773:   } 774:  775:   /** 776:    * Inserts all elements of the given collection at the given index of 777:    * this Vector. Behavior is undefined if the collection is modified during 778:    * this operation (for example, if this == c). 779:    * 780:    * @param c the collection to append 781:    * @return true if this vector changed, in other words c was not empty 782:    * @throws NullPointerException if c is null 783:    * @throws ArrayIndexOutOfBoundsException index < 0 || index > size() 784:    * @since 1.2 785:    */ 786:   public synchronized boolean addAll(int index, Collection c) 787:   { 788:     checkBoundInclusive(index); 789:     Iterator itr = c.iterator(); 790:     int csize = c.size(); 791:  792:     modCount++; 793:     ensureCapacity(elementCount + csize); 794:     int end = index + csize; 795:     if (elementCount > 0 && index != elementCount) 796:       System.arraycopy(elementData, index, 797:                elementData, end, elementCount - index); 798:     elementCount += csize; 799:     for ( ; index < end; index++) 800:       elementData[index] = itr.next(); 801:     return (csize > 0); 802:   } 803:  804:   /** 805:    * Compares this to the given object. 806:    * 807:    * @param o the object to compare to 808:    * @return true if the two are equal 809:    * @since 1.2 810:    */ 811:   public synchronized boolean equals(Object o) 812:   { 813:     // Here just for the sychronization. 814:     return super.equals(o); 815:   } 816:  817:   /** 818:    * Computes the hashcode of this object. 819:    * 820:    * @return the hashcode 821:    * @since 1.2 822:    */ 823:   public synchronized int hashCode() 824:   { 825:     // Here just for the sychronization. 826:     return super.hashCode(); 827:   } 828:  829:   /** 830:    * Returns a string representation of this Vector in the form 831:    * "[element0, element1, ... elementN]". 832:    * 833:    * @return the String representation of this Vector 834:    */ 835:   public synchronized String toString() 836:   { 837:     // Here just for the sychronization. 838:     return super.toString(); 839:   } 840:  841:   /** 842:    * Obtain a List view of a subsection of this list, from fromIndex 843:    * (inclusive) to toIndex (exclusive). If the two indices are equal, the 844:    * sublist is empty. The returned list is modifiable, and changes in one 845:    * reflect in the other. If this list is structurally modified in 846:    * any way other than through the returned list, the result of any subsequent 847:    * operations on the returned list is undefined. 848:    *  849:    * 850:    * @param fromIndex the index that the returned list should start from 851:    *        (inclusive) 852:    * @param toIndex the index that the returned list should go to (exclusive) 853:    * @return a List backed by a subsection of this vector 854:    * @throws IndexOutOfBoundsException if fromIndex < 0 855:    *         || toIndex > size() 856:    * @throws IllegalArgumentException if fromIndex > toIndex 857:    * @see ConcurrentModificationException 858:    * @since 1.2 859:    */ 860:   public synchronized ListsubList(int fromIndex, int toIndex) 861:   { 862:     Listsub = super.subList(fromIndex, toIndex); 863:     // We must specify the correct object to synchronize upon, hence the 864:     // use of a non-public API 865:     return new Collections.SynchronizedList(this, sub); 866:   } 867:  868:   /** 869:    * Removes a range of elements from this list. 870:    * Does nothing when toIndex is equal to fromIndex. 871:    * 872:    * @param fromIndex the index to start deleting from (inclusive) 873:    * @param toIndex the index to delete up to (exclusive) 874:    * @throws IndexOutOfBoundsException if fromIndex > toIndex 875:    */ 876:   // This does not need to be synchronized, because it is only called through 877:   // clear() of a sublist, and clear() had already synchronized. 878:   protected void removeRange(int fromIndex, int toIndex) 879:   { 880:     int change = toIndex - fromIndex; 881:     if (change > 0) 882:       { 883:         modCount++; 884:         System.arraycopy(elementData, toIndex, elementData, fromIndex, 885:                          elementCount - toIndex); 886:         int save = elementCount; 887:         elementCount -= change; 888:         Arrays.fill(elementData, elementCount, save, null); 889:       } 890:     else if (change < 0) 891:       throw new IndexOutOfBoundsException(); 892:   } 893:  894:   /** 895:    * Checks that the index is in the range of possible elements (inclusive). 896:    * 897:    * @param index the index to check 898:    * @throws ArrayIndexOutOfBoundsException if index > size 899:    */ 900:   private void checkBoundInclusive(int index) 901:   { 902:     // Implementation note: we do not check for negative ranges here, since 903:     // use of a negative index will cause an ArrayIndexOutOfBoundsException 904:     // with no effort on our part. 905:     if (index > elementCount) 906:       throw new ArrayIndexOutOfBoundsException(index + " > " + elementCount); 907:   } 908:  909:   /** 910:    * Checks that the index is in the range of existing elements (exclusive). 911:    * 912:    * @param index the index to check 913:    * @throws ArrayIndexOutOfBoundsException if index >= size 914:    */ 915:   private void checkBoundExclusive(int index) 916:   { 917:     // Implementation note: we do not check for negative ranges here, since 918:     // use of a negative index will cause an ArrayIndexOutOfBoundsException 919:     // with no effort on our part. 920:     if (index >= elementCount) 921:       throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); 922:   } 923:  924:   /** 925:    * Serializes this object to the given stream. 926:    * 927:    * @param s the stream to write to 928:    * @throws IOException if the underlying stream fails 929:    * @serialData just calls default write function 930:    */ 931:   private synchronized void writeObject(ObjectOutputStream s) 932:     throws IOException 933:   { 934:     s.defaultWriteObject(); 935:   } 936:  937: }

标签:

最新新闻:

新闻放送
Top