vector.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 1,266 行 · 第 1/3 页

JAVA
1,266
字号
/* * @(#)Vector.java	1.84 06/10/10 * * Copyright  1990-2008 Sun Microsystems, Inc. All Rights Reserved.   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER   *    * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License version   * 2 only, as published by the Free Software Foundation.    *    * This program is distributed in the hope that it will be useful, but   * WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   * General Public License version 2 for more details (a copy is   * included at /legal/license.txt).    *    * You should have received a copy of the GNU General Public License   * version 2 along with this work; if not, write to the Free Software   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA   * 02110-1301 USA    *    * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa   * Clara, CA 95054 or visit www.sun.com if you need additional   * information or have any questions.  * */package java.util;import sun.misc.CVM;/** * 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.71, 04/18/00 * @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];            CVM.copyObjectArray(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 native void ensureCapacityHelper(int minCapacity);    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];	    /* Since we will be calling CVM.copyObjectArray, we need to do	     * some extra bounds checks to maintain the behavior of	     * System.arraycopy(). Vector overrides may break assumptions	     * about possible values in elementCount.	     */	    if (elementCount < 0 || oldCapacity < elementCount) {		throw new ArrayIndexOutOfBoundsException();	    }     	    CVM.copyObjectArray(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;    }    private int capacitySimpleSync() {	if (CVM.simpleLockGrab(this)) {	    Object[] data = elementData;	    int result;	    boolean gotResult;	    if (data != null) {		result = data.length;		gotResult = true;	    } else {		result = 0;		gotResult = false;	    }	    CVM.simpleLockRelease(this);	    if (gotResult) {		return result;	    }	}	return capacity();    }    /**     * Returns the number of components in this vector.     *     * @return  the number of components in this vector.     */    public synchronized int size() {	return elementCount;    }    private int sizeSimpleSync() {	if (CVM.simpleLockGrab(this)) {	    int result = elementCount;	    CVM.simpleLockRelease(this);	    return result;	}	return size();    }    /**     * 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;    }    private boolean isEmptySimpleSync() {	if (CVM.simpleLockGrab(this)) {	    boolean result = (elementCount == 0);	    CVM.simpleLockRelease(this);	    return result;	}	return isEmpty();    }    /**     * 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");	    }	    private Object nextElementSimpleSync() {		if (CVM.simpleLockGrab(this)) {		    Object[] data = elementData;		    Object result;		    boolean gotResult;		    if (data != null && count >= 0 &&			count < data.length && count < elementCount)		    {			result = data[count++];			gotResult = true;		    } else {			result = null;			gotResult = false;		    }		    CVM.simpleLockRelease(this);		    if (gotResult) {			return result;		    }		} 		return nextElement();	    }	};    }    /**     * 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 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?