📄 unorderlist.java
字号:
/* * $RCSfile: UnorderList.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.4 $ * $Date: 2007/02/09 17:18:29 $ * $State: Exp $ */package javax.media.j3d;import java.util.Arrays;/** * A strongly type unorder array list. * The operation add(Object o) & remove(int i) take O(1) time. * The class is designed to optimize speed. So many reductance * procedures call and range check as found in ArrayList are * removed. * * <p> * Use the following code to iterate through an array. * * <pre> * UnorderList list = new UnorderList(YourClass.class); * // add element here * * YourClass[] arr = (YourClass []) list.toArray(); * int size = list.arraySize(); * for (int i=0; i < size; i++) { * YourClass obj = arr[i]; * .... * } * </pre> * * <p> * Note: * <ul> * 1) The array return is a copied of internal array.<br> * 2) Don't use arr.length , use list.arraySize();<br> * 3) No need to do casting for individual element as in * ArrayList.<br> * 4) UnorderList is thread safe. * </ul> */class UnorderList implements Cloneable, java.io.Serializable { /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. * * It is non-private to enable compiler do inlining for get(), * set(), remove() when -O flag turn on. */ transient Object elementData[]; /** * Clone copy of elementData return by toArray(true); */ transient Object cloneData[]; // size of the above clone objec. transient int cloneSize; transient boolean isDirty = true; /** * Component Type of individual array element entry */ Class componentType; /** * The size of the ArrayList (the number of elements it contains). * * We make it non-private to enable compiler do inlining for * getSize() when -O flag turn on. */ int size; /** * Constructs an empty list with the specified initial capacity. * and the class data Type * * @param initialCapacity the initial capacity of the list. * @param componentType class type of element in the list. */ UnorderList(int initialCapacity, Class componentType) { this.componentType = componentType; this.elementData = (Object[])java.lang.reflect.Array.newInstance( componentType, initialCapacity); } /** * Constructs an empty list. * @param componentType class type of element in the list. */ UnorderList(Class componentType) { this(10, componentType); } /** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list. */ UnorderList(int initialCapacity) { this(initialCapacity, Object.class); } /** * Constructs an empty list. * componentType default to Object. */ UnorderList() { this(10, Object.class); } /** * Returns the number of elements in this list. * * @return the number of elements in this list. */ final int size() { return size; } /** * Returns the size of entry use in toArray() number of elements * in this list. * * @return the number of elements in this list. */ final int arraySize() { return cloneSize; } /** * Tests if this list has no elements. * * @return <tt>true</tt> if this list has no elements; * <tt>false</tt> otherwise. */ final boolean isEmpty() { return size == 0; } /** * Returns <tt>true</tt> if this list contains the specified element. * * @param o element whose presence in this List is to be tested. */ synchronized final boolean contains(Object o) { if (o != null) { // common case first for (int i=size-1; i >= 0; i--) if (o.equals(elementData[i])) return true; } else { for (int i=size-1; i >= 0; i--) if (elementData[i]==null) return true; } return false; } /** * Add Object into the list if it is not already exists. * * @param o an object to add into the list * @return true if object successfully add, false if duplicate found */ synchronized final boolean addUnique(Object o) { if (!contains(o)) { add(o); return true; } return false; } /** * Searches for the last occurence of the given argument, testing * for equality using the <tt>equals</tt> method. * * @param o 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) */ synchronized final int indexOf(Object o) { if (o != null) { // common case first for (int i=size-1; i >= 0; i--) if (o.equals(elementData[i])) return i; } else { for (int i=size-1; i >= 0; i--) if (elementData[i]==null) 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. */ synchronized protected final Object clone() { try { UnorderList v = (UnorderList)super.clone(); v.elementData = (Object[])java.lang.reflect.Array.newInstance( componentType, size); System.arraycopy(elementData, 0, v.elementData, 0, size); isDirty = true; // can't use the old cloneData reference 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. * The size of the array may longer than the actual size. Use * arraySize() to retrieve the size. * The array return is a copied of internal array. if copy * is true. * * @return an array containing all of the elements in this list */ synchronized final Object[] toArray(boolean copy) { if (copy) { if (isDirty) { if ((cloneData == null) || cloneData.length < size) { cloneData = (Object[])java.lang.reflect.Array.newInstance( componentType, size); } System.arraycopy(elementData, 0, cloneData, 0, size); cloneSize = size; isDirty = false; } return cloneData; } else { cloneSize = size; return elementData; } } /** * Returns an array containing all of the elements in this list. * The size of the array may longer than the actual size. Use * arraySize() to retrieve the size. * The array return is a copied of internal array. So another * thread can continue add/delete the current list. However, * it should be noticed that two call to toArray() may return * the same copy. * * @return an array containing all of the elements in this list */ synchronized final Object[] toArray() { return toArray(true); } /** * Returns an array containing elements starting from startElement * all of the elements in this list. A new array of exact size * is always allocated. * * @param startElement starting element to copy * * @return an array containing elements starting from * startElement, null if element not found. * */ synchronized final Object[] toArray(Object startElement) { int idx = indexOf(startElement); if (idx < 0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -