📄 vector.java
字号:
/* * @(#)Vector.java 1.89 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package java.util;/** * The <code>Vector</code> class implements a growable array of * objects. Like an array, it contains components that can be * accessed using an integer index. However, the size of a * <code>Vector</code> can grow or shrink as needed to accommodate * adding and removing items after the <code>Vector</code> has been created.<p> * * Each vector tries to optimize storage management by maintaining a * <code>capacity</code> and a <code>capacityIncrement</code>. The * <code>capacity</code> is always at least as large as the vector * size; it is usually larger because as components are added to the * vector, the vector's storage increases in chunks the size of * <code>capacityIncrement</code>. An application can increase the * capacity of a vector before inserting a large number of * components; this reduces the amount of incremental reallocation. <p> * * As of the Java 2 platform v1.2, this class has been retrofitted to * implement List, so that it becomes a part of Java's collection framework. * Unlike the new collection implementations, Vector is synchronized.<p> * * The Iterators returned by Vector's iterator and listIterator * methods are <em>fail-fast</em>: if the Vector is structurally modified * at any time after the Iterator is created, in any way except through the * Iterator's own remove or add methods, the Iterator will throw a * ConcurrentModificationException. Thus, in the face of concurrent * modification, the Iterator fails quickly and cleanly, rather than risking * arbitrary, non-deterministic behavior at an undetermined time in the future. * The Enumerations returned by Vector's elements method are <em>not</em> * fail-fast. * * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed * as it is, generally speaking, impossible to make any hard guarantees in the * presence of unsynchronized concurrent modification. Fail-fast iterators * throw <tt>ConcurrentModificationException</tt> on a best-effort basis. * Therefore, it would be wrong to write a program that depended on this * exception for its correctness: <i>the fail-fast behavior of iterators * should be used only to detect bugs.</i><p> * * This class is a member of the * <a href="{@docRoot}/../guide/collections/index.html"> * Java Collections Framework</a>. * * @author Lee Boynton * @author Jonathan Payne * @version 1.89, 01/23/03 * @see Collection * @see List * @see ArrayList * @see LinkedList * @since JDK1.0 */public class Vector extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable{ /** * The array buffer into which the components of the vector are * stored. The capacity of the vector is the length of this array buffer, * and is at least large enough to contain all the vector's elements.<p> * * Any array elements following the last element in the Vector are null. * * @serial */ protected Object elementData[]; /** * The number of valid components in this <tt>Vector</tt> object. * Components <tt>elementData[0]</tt> through * <tt>elementData[elementCount-1]</tt> are the actual items. * * @serial */ protected int elementCount; /** * The amount by which the capacity of the vector is automatically * incremented when its size becomes greater than its capacity. If * the capacity increment is less than or equal to zero, the capacity * of the vector is doubled each time it needs to grow. * * @serial */ protected int capacityIncrement; /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -2767605614048989439L; /** * Constructs an empty vector with the specified initial capacity and * capacity increment. * * @param initialCapacity the initial capacity of the vector. * @param capacityIncrement the amount by which the capacity is * increased when the vector overflows. * @exception IllegalArgumentException if the specified initial capacity * is negative */ public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; } /** * Constructs an empty vector with the specified initial capacity and * with its capacity increment equal to zero. * * @param initialCapacity the initial capacity of the vector. * @exception IllegalArgumentException if the specified initial capacity * is negative */ public Vector(int initialCapacity) { this(initialCapacity, 0); } /** * Constructs an empty vector so that its internal data array * has size <tt>10</tt> and its standard capacity increment is * zero. */ public Vector() { this(10); } /** * Constructs a vector containing the elements of the specified * collection, in the order they are returned by the collection's * iterator. * * @param c the collection whose elements are to be placed into this * vector. * @throws NullPointerException if the specified collection is null. * @since 1.2 */ public Vector(Collection c) { elementCount = c.size(); // 10% for growth elementData = new Object[ (int)Math.min((elementCount*110L)/100,Integer.MAX_VALUE)]; c.toArray(elementData); } /** * Copies the components of this vector into the specified array. The * item at index <tt>k</tt> in this vector is copied into component * <tt>k</tt> of <tt>anArray</tt>. The array must be big enough to hold * all the objects in this vector, else an * <tt>IndexOutOfBoundsException</tt> is thrown. * * @param anArray the array into which the components get copied. * @throws NullPointerException if the given array is null. */ public synchronized void copyInto(Object anArray[]) { System.arraycopy(elementData, 0, anArray, 0, elementCount); } /** * Trims the capacity of this vector to be the vector's current * size. If the capacity of this vector is larger than its current * size, then the capacity is changed to equal the size by replacing * its internal data array, kept in the field <tt>elementData</tt>, * with a smaller one. An application can use this operation to * minimize the storage of a vector. */ public synchronized void trimToSize() { modCount++; int oldCapacity = elementData.length; if (elementCount < oldCapacity) { Object oldData[] = elementData; elementData = new Object[elementCount]; System.arraycopy(oldData, 0, elementData, 0, elementCount); } } /** * Increases the capacity of this vector, if necessary, to ensure * that it can hold at least the number of components specified by * the minimum capacity argument. * * <p>If the current capacity of this vector is less than * <tt>minCapacity</tt>, then its capacity is increased by replacing its * internal data array, kept in the field <tt>elementData</tt>, with a * larger one. The size of the new data array will be the old size plus * <tt>capacityIncrement</tt>, unless the value of * <tt>capacityIncrement</tt> is less than or equal to zero, in which case * the new capacity will be twice the old capacity; but if this new size * is still smaller than <tt>minCapacity</tt>, then the new capacity will * be <tt>minCapacity</tt>. * * @param minCapacity the desired minimum capacity. */ public synchronized void ensureCapacity(int minCapacity) { modCount++; ensureCapacityHelper(minCapacity); } /** * This implements the unsynchronized semantics of ensureCapacity. * Synchronized methods in this class can internally call this * method for ensuring capacity without incurring the cost of an * extra synchronization. * * @see java.util.Vector#ensureCapacity(int) */ private void ensureCapacityHelper(int minCapacity) { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2); if (newCapacity < minCapacity) { newCapacity = minCapacity; } elementData = new Object[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, elementCount); } } /** * Sets the size of this vector. If the new size is greater than the * current size, new <code>null</code> items are added to the end of * the vector. If the new size is less than the current size, all * components at index <code>newSize</code> and greater are discarded. * * @param newSize the new size of this vector. * @throws ArrayIndexOutOfBoundsException if new size is negative. */ public synchronized void setSize(int newSize) { modCount++; if (newSize > elementCount) { ensureCapacityHelper(newSize); } else { for (int i = newSize ; i < elementCount ; i++) { elementData[i] = null; } } elementCount = newSize; } /** * Returns the current capacity of this vector. * * @return the current capacity (the length of its internal * data array, kept in the field <tt>elementData</tt> * of this vector). */ public synchronized int capacity() { return elementData.length; } /** * Returns the number of components in this vector. * * @return the number of components in this vector. */ public synchronized int size() { return elementCount; } /** * Tests if this vector has no components. * * @return <code>true</code> if and only if this vector has * no components, that is, its size is zero; * <code>false</code> otherwise. */ public synchronized boolean isEmpty() { return elementCount == 0; } /** * Returns an enumeration of the components of this vector. The * returned <tt>Enumeration</tt> object will generate all items in * this vector. The first item generated is the item at index <tt>0</tt>, * then the item at index <tt>1</tt>, and so on. * * @return an enumeration of the components of this vector. * @see Enumeration * @see Iterator */ public Enumeration elements() { return new Enumeration() { int count = 0; public boolean hasMoreElements() { return count < elementCount; } public Object nextElement() { synchronized (Vector.this) { if (count < elementCount) { return elementData[count++]; } } throw new NoSuchElementException("Vector Enumeration"); } }; } /** * Tests if the specified object is a component in this vector. * * @param elem an object. * @return <code>true</code> if and only if the specified object * is the same as a component in this vector, as determined by the * <tt>equals</tt> method; <code>false</code> otherwise. */ public boolean contains(Object elem) { return indexOf(elem, 0) >= 0; } /** * Searches for the first occurence of the given argument, testing * for equality using the <code>equals</code> method. * * @param elem an object. * @return the index of the first occurrence of the argument in this * vector, that is, the smallest value <tt>k</tt> such that * <tt>elem.equals(elementData[k])</tt> is <tt>true</tt>; * returns <code>-1</code> if the object is not found. * @see Object#equals(Object) */ public int indexOf(Object elem) { return indexOf(elem, 0); } /** * Searches for the first occurence of the given argument, beginning
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -