【源代码】java.util.Vector容器源代码详解
这里列出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: }
标签:
相关推荐:
最新新闻:
- 电脑闹铃怎么设置?如何用电脑设置好闹钟?
- 怎么设置电脑自动开关机?设置自动开关机的具体步骤
- 提示ijl15.dll文件丢失或损坏怎么办?ijl15.dll文件丢失原因分析及解决方法
- 如何卸载冰点还原精灵?怎么才能把他彻底删除?
- formatconverters.exe是什么软件?使用说明及注意事项
- 解锁bootloader是什么意思?解锁bootloader会清除数据吗?
- 【源代码】java.util.Vector容器源代码详解
- PDG文件是什么格式?PDG文件打开方法
- trustedinstaller.exe是什么意思?如何解决其CPU占用率问题?
- IE浏览器打不开卡死崩溃了该怎么修复?有什么修复方法?
- beacon时槽什么意思?beacon时槽越大越好吗?
- wifi发射器怎么用?介绍WiFi发射器的用法步骤
- 主板上都有哪些接口?主板上各接口都有什么用?
- rar密码有什么破解方法?解密文件有什么方法?
- 什么是百度权重?百度权重详解及影响因素
- 打印机和复印机的辐射量有多大?打印机和复印机的辐射量
- iphone表情符号如何添加?iphone表情符号添加方法 -速看
- 腾龙镜头多少钱?腾龙镜头型号及报价大全
- 回顾腾讯QQ的成长发展史(1998-2016年)-环球热门
- 最新资讯:张一鸣:华为人才基因的真正密码
- 世界快资讯丨“橡皮擦”用英语该怎么说?橡皮擦的英文说法
- 全球即时看!乐视手机怎么样?乐视手机好用吗?
- win10关闭自动更新后怎么更新?win10关闭自动更新后更新方法|全球新动态
- 全球速递!tcl液晶监视器你了解多少?tcl液晶监视器的价格
- uushare书签:用于收藏网址的一种工具_世界焦点
- 扫雷和空当接龙freecell:算法深度优先_视点
- 环球热门:激光器结构原理是什么?激光器结构原理介绍
- 索尼投影机价格怎么样?sony投影机功能如何?
- 自助建站到底是什么?如何免费生成一个网站?
- 【反汇编】ce附加红警3找钱的进程:环球速递
- 快讯:索尼psp游戏机多少钱?索尼psp报价及相关介绍
- pH、水温、溶解氧的指标图 pH值偏高有什么危害吗?-环球快播报
- 三星c3500怎么样?三星c3500最新报价
- 网卡是什么?网卡有什么功能?
- 硕美科g927怎么样?硕美科g927好不好?
- 一台空调一小时用多少电?空调耗电如何计算?|快报
- rayfile网盘功能介绍 rayfile网盘安装步骤及安装注意事项
- 【天天报资讯】暗黑3怎么购买?暗黑3国服购买指南
- 【技术】硬盘存储器的层次结构及原理
- 数码相机销量排行榜 看看你的品牌排第几?
- 硬盘整数分区怎么计算?NTFS整数分区数值表分享
- 马冬晗学习计划表 清华学霸计划表曝光-精选
- MS-TTS:免费微软TTS语音合成工具 一键合成导出MP3音频
- 环球快讯:《霹雳五号》:一个机器人的自我意识
- 9个学习资源分享给大家 推荐几个资源聚集地
- 焦点观察:短网址移动网缩短接口网址api调用php方式解析
- 西瓜足迹用不了怎么办?怎么回事?
- RMSE、MAE、MSE 如何衡量模型效果好坏?-全球看热讯
- 微信聊天记录如何备份转移到另外一个手机上?操作步骤_天天观天下
- 每日动态!厨房管理游戏《末日等待》Steam页面上线 支持简中
- 每日动态!厨房管理游戏《末日等待》Steam页面上线 支持简中
- 网飞推出AI视频短片《犬与少年》 实验性作品
- 【天天时快讯】《艾尔登法环》Steam页面后台更新 或是将有新内容发布
- 正荣地产:1月合约销售金额约为13.56亿元|世界看热讯
- rayfile网盘功能介绍 rayfile网盘安装步骤及安装注意事项
- 硬盘整数分区怎么计算?NTFS整数分区数值表分享
- bin文件夹是什么?bin文件删了有什么影响?
- Bodypaint 3D怎么用?Bodypaint 3D安装使用方法
- DLL是什么?winmm.dll丢失怎么解决?
- 硬盘温度多少度才算正常?硬盘温度过高怎么办呢?
- 积分电路是什么?积分电路的原理和作用
- XPS Viewer是什么软件?XPS Viewer的使用方法
- 小米13 Ultra曝光:2K E6曲面屏+1英寸超大底+120倍长焦-每日热议
- 天天资讯:《星球大战绝地:幸存者》9分钟实机:双持光剑砍瓜切菜
- 《猎天使魔女3》已售出104万份 贝姐魅力大|热文
- 科技裁员潮愈演愈烈!Zoom拟解雇1300人-即时焦点
- 四川针对10领域出36条政策推动经济整体好转
- 10年超12万人逃离巴黎!副市长:高房价带来巨大压力
- ChatGPT竞品来了!谷歌公布聊天机器人Bard:世界微头条
- 天天新资讯:ChatGPT引爆新一轮科技军备赛
- 小值360度全景摄像头直降400元到手79元
- 全球热头条丨2999元!中国特供游戏神U英特尔酷睿i7-13790F曝光
- 天天速递!【手慢无】开工大促!AMD锐龙R5-5600G神U低至769元
- RTX 4090+双模技术加持 雷神顶级电竞本ZERO 2023大黄蜂款上市:全球时快讯
- 环球关注:LD62H系列精巧高压电磁阀