arraylist.java

来自「java源代码 请看看啊 提点宝贵的意见」· Java 代码 · 共 550 行 · 第 1/2 页

JAVA
550
字号
/* * @(#)ArrayList.java	1.41 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package java.util;/** * Resizable-array implementation of the <tt>List</tt> interface.  Implements * all optional list operations, and permits all elements, including * <tt>null</tt>.  In addition to implementing the <tt>List</tt> interface, * this class provides methods to manipulate the size of the array that is * used internally to store the list.  (This class is roughly equivalent to * <tt>Vector</tt>, except that it is unsynchronized.)<p> * * The <tt>size</tt>, <tt>isEmpty</tt>, <tt>get</tt>, <tt>set</tt>, * <tt>iterator</tt>, and <tt>listIterator</tt> operations run in constant * time.  The <tt>add</tt> operation runs in <i>amortized constant time</i>, * that is, adding n elements requires O(n) time.  All of the other operations * run in linear time (roughly speaking).  The constant factor is low compared * to that for the <tt>LinkedList</tt> implementation.<p> * * Each <tt>ArrayList</tt> instance has a <i>capacity</i>.  The capacity is * the size of the array used to store the elements in the list.  It is always * at least as large as the list size.  As elements are added to an ArrayList, * its capacity grows automatically.  The details of the growth policy are not * specified beyond the fact that adding an element has constant amortized * time cost.<p>  * * An application can increase the capacity of an <tt>ArrayList</tt> instance * before adding a large number of elements using the <tt>ensureCapacity</tt> * operation.  This may reduce the amount of incremental reallocation.<p> * * <strong>Note that this implementation is not synchronized.</strong> If * multiple threads access an <tt>ArrayList</tt> instance concurrently, and at * least one of the threads modifies the list structurally, it <i>must</i> be * synchronized externally.  (A structural modification is any operation that * adds or deletes one or more elements, or explicitly resizes the backing * array; merely setting the value of an element is not a structural * modification.)  This is typically accomplished by synchronizing on some * object that naturally encapsulates the list.  If no such object exists, the * list should be "wrapped" using the <tt>Collections.synchronizedList</tt> * method.  This is best done at creation time, to prevent accidental * unsynchronized access to the list: * <pre> *	List list = Collections.synchronizedList(new ArrayList(...)); * </pre><p> * * The iterators returned by this class's <tt>iterator</tt> and * <tt>listIterator</tt> methods are <i>fail-fast</i>: if list 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.<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  Josh Bloch * @version 1.41, 01/23/03 * @see	    Collection * @see	    List * @see	    LinkedList * @see	    Vector * @see	    Collections#synchronizedList(List) * @since   1.2 */public class ArrayList extends AbstractList        implements List, RandomAccess, Cloneable, java.io.Serializable{    private static final long serialVersionUID = 8683452581122892189L;    /**     * The array buffer into which the elements of the ArrayList are stored.     * The capacity of the ArrayList is the length of this array buffer.     */    private transient Object elementData[];    /**     * The size of the ArrayList (the number of elements it contains).     *     * @serial     */    private int size;    /**     * Constructs an empty list with the specified initial capacity.     *     * @param   initialCapacity   the initial capacity of the list.     * @exception IllegalArgumentException if the specified initial capacity     *            is negative     */    public ArrayList(int initialCapacity) {	super();        if (initialCapacity < 0)            throw new IllegalArgumentException("Illegal Capacity: "+                                               initialCapacity);	this.elementData = new Object[initialCapacity];    }    /**     * Constructs an empty list with an initial capacity of ten.     */    public ArrayList() {	this(10);    }    /**     * Constructs a list containing the elements of the specified     * collection, in the order they are returned by the collection's     * iterator.  The <tt>ArrayList</tt> instance has an initial capacity of     * 110% the size of the specified collection.     *     * @param c the collection whose elements are to be placed into this list.     * @throws NullPointerException if the specified collection is null.     */    public ArrayList(Collection c) {        size = c.size();        // Allow 10% room for growth        elementData = new Object[                      (int)Math.min((size*110L)/100,Integer.MAX_VALUE)];         c.toArray(elementData);    }    /**     * Trims the capacity of this <tt>ArrayList</tt> instance to be the     * list's current size.  An application can use this operation to minimize     * the storage of an <tt>ArrayList</tt> instance.     */    public void trimToSize() {	modCount++;	int oldCapacity = elementData.length;	if (size < oldCapacity) {	    Object oldData[] = elementData;	    elementData = new Object[size];	    System.arraycopy(oldData, 0, elementData, 0, size);	}    }    /**     * Increases the capacity of this <tt>ArrayList</tt> instance, if     * necessary, to ensure  that it can hold at least the number of elements     * specified by the minimum capacity argument.      *     * @param   minCapacity   the desired minimum capacity.     */    public void ensureCapacity(int minCapacity) {	modCount++;	int oldCapacity = elementData.length;	if (minCapacity > oldCapacity) {	    Object oldData[] = elementData;	    int newCapacity = (oldCapacity * 3)/2 + 1;    	    if (newCapacity < minCapacity)		newCapacity = minCapacity;	    elementData = new Object[newCapacity];	    System.arraycopy(oldData, 0, elementData, 0, size);	}    }    /**     * Returns the number of elements in this list.     *     * @return  the number of elements in this list.     */    public int size() {	return size;    }    /**     * Tests if this list has no elements.     *     * @return  <tt>true</tt> if this list has no elements;     *          <tt>false</tt> otherwise.     */    public boolean isEmpty() {	return size == 0;    }    /**     * Returns <tt>true</tt> if this list contains the specified element.     *     * @param elem element whose presence in this List is to be tested.     * @return  <code>true</code> if the specified element is present;     *		<code>false</code> otherwise.     */    public boolean contains(Object elem) {	return indexOf(elem) >= 0;    }    /**     * Searches for the first occurence of the given argument, testing      * for equality using the <tt>equals</tt> method.      *     * @param   elem   an object.     * @return  the index of the first occurrence of the argument in this     *          list; returns <tt>-1</tt> if the object is not found.     * @see     Object#equals(Object)     */    public int indexOf(Object elem) {	if (elem == null) {	    for (int i = 0; i < size; i++)		if (elementData[i]==null)		    return i;	} else {	    for (int i = 0; i < size; i++)		if (elem.equals(elementData[i]))		    return i;	}	return -1;    }    /**     * Returns the index of the last occurrence of the specified object in     * this list.     *     * @param   elem   the desired element.     * @return  the index of the last occurrence of the specified object in     *          this list; returns -1 if the object is not found.     */    public int lastIndexOf(Object elem) {	if (elem == null) {	    for (int i = size-1; i >= 0; i--)		if (elementData[i]==null)		    return i;	} else {	    for (int i = size-1; i >= 0; i--)		if (elem.equals(elementData[i]))		    return i;	}	return -1;    }    /**     * Returns a shallow copy of this <tt>ArrayList</tt> instance.  (The     * elements themselves are not copied.)     *     * @return  a clone of this <tt>ArrayList</tt> instance.     */    public Object clone() {	try { 	    ArrayList v = (ArrayList)super.clone();	    v.elementData = new Object[size];	    System.arraycopy(elementData, 0, v.elementData, 0, size);	    v.modCount = 0;	    return v;	} catch (CloneNotSupportedException e) { 	    // this shouldn't happen, since we are Cloneable	    throw new InternalError();	}    }    /**     * Returns an array containing all of the elements in this list     * in the correct order.     *     * @return an array containing all of the elements in this list     * 	       in the correct order.     */    public Object[] toArray() {	Object[] result = new Object[size];	System.arraycopy(elementData, 0, result, 0, size);

⌨️ 快捷键说明

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