- * If you are post-multiplying matrices, To transform a point p from object-space to world-space you would need to - * post-multiply by the worldMatrix. (p' = p * wm) matrix = [S][SO][R][JO][IS][T] where R = [RX][RY][RZ] (Note: order - * is determined by rotateOrder) - *

- * If you are post-multiplying matrices, To transform a point p from object-space to world-space you would need to - * post-multiply by the worldMatrix. (p' = p * wm) matrix = [SP-1][S][SH][SP][ST][RP-1][RA][R][RP][RT][T] where R = - * [RX][RY][RZ] (Note: order is determined by rotateOrder) - *

- *

The size, isEmpty, get, set, iterator, and listIterator - * operations run in constant time. The add operation runs in amortized constant time, 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 LinkedList implementation. - *

- *

Each ArrayList instance has a capacity. 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. - *

- *

An application can increase the capacity of an ArrayList instance before adding a large number of - * elements using the ensureCapacity operation. This may reduce the amount of incremental reallocation. - *

- *

Note that this implementation is not synchronized. If multiple threads access an - * ArrayList instance concurrently, and at least one of the threads modifies the list structurally, it - * must 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 {@link Collections#synchronizedList - * Collections.synchronizedList} method. This is best done at creation time, to prevent accidental - * unsynchronized access to the list:

`- *   List list = Collections.synchronizedList(new ArrayList(...));`
- *

- *

The iterators returned by this class's {@link #iterator() iterator} and {@link - * #listIterator(int) listIterator} methods are fail-fast: if the list is structurally modified at any time - * after the iterator is created, in any way except through the iterator's own {@link ListIterator#remove() remove} or - * {@link ListIterator#add(Object) add} methods, the iterator will throw a {@link 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. - *

- *

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 {@code - * ConcurrentModificationException} on a best-effort basis. Therefore, it would be wrong to write a program that - * depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect - * bugs. - *

- *

This class is a member of the Java Collections - * Framework. - * - * @see Collection - * @see List - * @see LinkedList - * @see Vector - * - * TODO replace with ObservableFloatArray - */ -public class FloatArrayList extends AbstractList - implements List, RandomAccess, 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. - */ - private transient float[] 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 - * @throws IllegalArgumentException if the specified initial capacity is negative - */ - public FloatArrayList(int initialCapacity) { - super(); - if (initialCapacity < 0) { - throw new IllegalArgumentException( - "Illegal Capacity: " + - initialCapacity); - } - this.elementData = new float[initialCapacity]; - } - - /** Constructs an empty list with an initial capacity of ten. */ - public FloatArrayList() { - this(10); - } - - /** - * Constructs a list 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 list - * @throws NullPointerException if the specified collection is null - */ - public FloatArrayList(Collection c) { - elementData = new float[c.size()]; - int i = 0; - for (Float d : c) { - elementData[i] = d; - i++; - } - size = elementData.length; - } - - /** - * Trims the capacity of this ArrayList instance to be the list current size. An application can use this - * operation to minimize the storage of an ArrayList instance. - */ - public void trimToSize() { - modCount++; - int oldCapacity = elementData.length; - if (size < oldCapacity) { - elementData = Arrays.copyOf(elementData, size); - } - } - - /** - * Increases the capacity of this ArrayList 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) { - if (minCapacity > 0) { - ensureCapacityInternal(minCapacity); - } - } - - private void ensureCapacityInternal(int minCapacity) { - modCount++; - // overflow-conscious code - if (minCapacity - elementData.length > 0) { - grow(minCapacity); - } - } - - /** - * The maximum size of array to allocate. Some VMs reserve some header words in an array. Attempts to allocate - * larger arrays may result in OutOfMemoryError: Requested array size exceeds VM limit - */ - private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - - /** - * Increases the capacity to ensure that it can hold at least the number of elements specified by the minimum - * capacity argument. - * - * @param minCapacity the desired minimum capacity - */ - private void grow(int minCapacity) { - // overflow-conscious code - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + (oldCapacity >> 1); - if (newCapacity - minCapacity < 0) - newCapacity = minCapacity; - if (newCapacity - MAX_ARRAY_SIZE > 0) - newCapacity = hugeCapacity(minCapacity); - // minCapacity is usually close to size, so this is a win: - elementData = Arrays.copyOf(elementData, newCapacity); - } - - private static int hugeCapacity(int minCapacity) { - if (minCapacity < 0) // overflow - throw new OutOfMemoryError(); - return (minCapacity > MAX_ARRAY_SIZE) ? - Integer.MAX_VALUE : - MAX_ARRAY_SIZE; - } - - /** - * Returns the number of elements in this list. - * - * @return the number of elements in this list - */ - @Override public int size() { - return size; - } - - /** - * Returns true if this list contains no elements. - * - * @return true if this list contains no elements - */ - @Override public boolean isEmpty() { - return size == 0; - } - - /** - * Returns true if this list contains the specified element. More formally, returns true if and - * only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)). - * - * @param o element whose presence in this list is to be tested - * @return true if this list contains the specified element - */ - @Override public boolean contains(Object o) { - return indexOf(o) >= 0; - } - - /** - * Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not - * contain the element. More formally, returns the lowest index i such that - * (o==null ? get(i)==null : o.equals(get(i))), or -1 if there is no such index. - */ - @Override public int indexOf(Object o) { - if (o instanceof Float) { - for (int i = 0; i < size; i++) { - if (o.equals(elementData[i])) { - return i; - } - } - } - return -1; - } - - /** - * Returns the index of the last occurrence of the specified element in this list, or -1 if this list does not - * contain the element. More formally, returns the highest index i such that - * (o==null ? get(i)==null : o.equals(get(i))), or -1 if there is no such index. - */ - @Override public int lastIndexOf(Object o) { - if (o instanceof Float) { - for (int i = size - 1; i >= 0; i--) - if (o.equals(elementData[i])) - return i; - } - return -1; - } - - /** - * Returns a shallow copy of this ArrayList instance. (The elements themselves are not copied.) - * - * @return a clone of this ArrayList instance - */ - @Override public Object clone() { - try { - @SuppressWarnings("unchecked") - FloatArrayList v = (FloatArrayList) super.clone(); - v.elementData = Arrays.copyOf(elementData, 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 proper sequence (from first to last element). - *

- *

The returned array will be "safe" in that no references to it are maintained by this list. (In other words, - * this method must allocate a new array). The caller is thus free to modify the returned array. - *

- *

This method acts as bridge between array-based and collection-based APIs. - * - * @return an array containing all of the elements in this list in proper sequence - */ - @Override public Object[] toArray() { - Float[] array = new Float[size]; - for (int i = 0; i < size; i++) { - array[i] = elementData[i]; - } - return array; - } - - /** - * Returns an array containing all of the elements in this list in proper sequence (from first to last element); the - * runtime type of the returned array is that of the specified array. If the list fits in the specified array, it - * is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the - * size of this list. - *

- *

- *

The returned list iterator is fail-fast. - * - * @throws IndexOutOfBoundsException {@inheritDoc} - */ - @Override public ListIterator listIterator(int index) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("Index: " + index); - return new ListItr(index); - } - - /** - * Returns a list iterator over the elements in this list (in proper sequence). - *

- *

The returned list iterator is fail-fast. - * - * @see #listIterator(int) - */ - @Override public ListIterator listIterator() { - return new ListItr(0); - } - - /** - * Returns an iterator over the elements in this list in proper sequence. - *

- *

The returned iterator is fail-fast. - * - * @return an iterator over the elements in this list in proper sequence - */ - @Override public Iterator iterator() { - return new Itr(); - } - - /** An optimized version of AbstractList.Itr */ - private class Itr implements Iterator { - int cursor; // index of next element to return - int lastRet = -1; // index of last element returned; -1 if no such - int expectedModCount = modCount; - - @Override public boolean hasNext() { - return cursor != size; - } - - @SuppressWarnings("unchecked") - @Override public Float next() { - checkForComodification(); - int i = cursor; - if (i >= size) - throw new NoSuchElementException(); - float[] elementData = FloatArrayList.this.elementData; - if (i >= elementData.length) - throw new ConcurrentModificationException(); - cursor = i + 1; - return (Float) elementData[lastRet = i]; - } - - @Override public void remove() { - if (lastRet < 0) - throw new IllegalStateException(); - checkForComodification(); - - try { - FloatArrayList.this.remove(lastRet); - cursor = lastRet; - lastRet = -1; - expectedModCount = modCount; - } catch (IndexOutOfBoundsException ex) { - throw new ConcurrentModificationException(); - } - } - - final void checkForComodification() { - if (modCount != expectedModCount) - throw new ConcurrentModificationException(); - } - } - - /** An optimized version of AbstractList.ListItr */ - private class ListItr extends Itr implements ListIterator { - ListItr(int index) { - super(); - cursor = index; - } - - @Override public boolean hasPrevious() { - return cursor != 0; - } - - @Override public int nextIndex() { - return cursor; - } - - @Override public int previousIndex() { - return cursor - 1; - } - - @SuppressWarnings("unchecked") - @Override public Float previous() { - checkForComodification(); - int i = cursor - 1; - if (i < 0) - throw new NoSuchElementException(); - float[] elementData = FloatArrayList.this.elementData; - if (i >= elementData.length) - throw new ConcurrentModificationException(); - cursor = i; - return (Float) elementData[lastRet = i]; - } - - @Override public void set(Float e) { - if (lastRet < 0) - throw new IllegalStateException(); - checkForComodification(); - - try { - FloatArrayList.this.set(lastRet, e); - } catch (IndexOutOfBoundsException ex) { - throw new ConcurrentModificationException(); - } - } - - @Override public void add(Float e) { - checkForComodification(); - - try { - int i = cursor; - FloatArrayList.this.add(i, e); - cursor = i + 1; - lastRet = -1; - expectedModCount = modCount; - } catch (IndexOutOfBoundsException ex) { - throw new ConcurrentModificationException(); - } - } - } - - /** - * Returns a view of the portion of this list between the specified {@code fromIndex}, inclusive, and {@code - * toIndex}, exclusive. (If {@code fromIndex} and {@code toIndex} are equal, the returned list is empty.) The - * returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, - * and vice-versa. The returned list supports all of the optional list operations. - *

- *

This method eliminates the need for explicit range operations (of the sort that commonly exist for arrays). - * Any operation that expects a list can be used as a range operation by passing a subList view instead of a whole - * list. For example, the following idiom removes a range of elements from a list: - *

```-     *      list.subList(from, to).clear();
-     * ```
- * Similar idioms may be constructed for {@link #indexOf(Object)} and {@link #lastIndexOf(Object)}, and all of the - * algorithms in the {@link Collections} class can be applied to a subList. - *

- *

- *

The size, isEmpty, get, set, iterator, and listIterator - * operations run in constant time. The add operation runs in amortized constant time, 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 LinkedList implementation. - *

- *

Each ArrayList instance has a capacity. 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. - *

- *

An application can increase the capacity of an ArrayList instance before adding a large number of - * elements using the ensureCapacity operation. This may reduce the amount of incremental reallocation. - *

- *

Note that this implementation is not synchronized. If multiple threads access an - * ArrayList instance concurrently, and at least one of the threads modifies the list structurally, it - * must 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 {@link Collections#synchronizedList - * Collections.synchronizedList} method. This is best done at creation time, to prevent accidental - * unsynchronized access to the list:

`- *   List list = Collections.synchronizedList(new ArrayList(...));`
- *

- *

The iterators returned by this class's {@link #iterator() iterator} and {@link - * #listIterator(int) listIterator} methods are fail-fast: if the list is structurally modified at any time - * after the iterator is created, in any way except through the iterator's own {@link ListIterator#remove() remove} or - * {@link ListIterator#add(Object) add} methods, the iterator will throw a {@link 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. - *

- *

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 {@code - * ConcurrentModificationException} on a best-effort basis. Therefore, it would be wrong to write a program that - * depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect - * bugs. - *

- *

This class is a member of the Java Collections - * Framework. - * - * @see Collection - * @see List - * @see LinkedList - * @see Vector - * - * TODO replace with ObservableIntegerArray - */ -public class IntegerArrayList extends AbstractList - implements List, RandomAccess, 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. - */ - private transient int[] 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 - * @throws IllegalArgumentException if the specified initial capacity is negative - */ - public IntegerArrayList(int initialCapacity) { - super(); - if (initialCapacity < 0) { - throw new IllegalArgumentException( - "Illegal Capacity: " + - initialCapacity); - } - this.elementData = new int[initialCapacity]; - } - - /** Constructs an empty list with an initial capacity of ten. */ - public IntegerArrayList() { - this(10); - } - - /** - * Constructs a list 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 list - * @throws NullPointerException if the specified collection is null - */ - public IntegerArrayList(Collection c) { - elementData = new int[c.size()]; - int i = 0; - for (Integer d : c) { - elementData[i] = d; - i++; - } - size = elementData.length; - } - - /** - * Trims the capacity of this ArrayList instance to be the list current size. An application can use this - * operation to minimize the storage of an ArrayList instance. - */ - public void trimToSize() { - modCount++; - int oldCapacity = elementData.length; - if (size < oldCapacity) { - elementData = Arrays.copyOf(elementData, size); - } - } - - /** - * Increases the capacity of this ArrayList 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) { - if (minCapacity > 0) { - ensureCapacityInternal(minCapacity); - } - } - - private void ensureCapacityInternal(int minCapacity) { - modCount++; - // overflow-conscious code - if (minCapacity - elementData.length > 0) { - grow(minCapacity); - } - } - - /** - * The maximum size of array to allocate. Some VMs reserve some header words in an array. Attempts to allocate - * larger arrays may result in OutOfMemoryError: Requested array size exceeds VM limit - */ - private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - - /** - * Increases the capacity to ensure that it can hold at least the number of elements specified by the minimum - * capacity argument. - * - * @param minCapacity the desired minimum capacity - */ - private void grow(int minCapacity) { - // overflow-conscious code - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + (oldCapacity >> 1); - if (newCapacity - minCapacity < 0) - newCapacity = minCapacity; - if (newCapacity - MAX_ARRAY_SIZE > 0) - newCapacity = hugeCapacity(minCapacity); - // minCapacity is usually close to size, so this is a win: - elementData = Arrays.copyOf(elementData, newCapacity); - } - - private static int hugeCapacity(int minCapacity) { - if (minCapacity < 0) // overflow - throw new OutOfMemoryError(); - return (minCapacity > MAX_ARRAY_SIZE) ? - Integer.MAX_VALUE : - MAX_ARRAY_SIZE; - } - - /** - * Returns the number of elements in this list. - * - * @return the number of elements in this list - */ - @Override public int size() { - return size; - } - - /** - * Returns true if this list contains no elements. - * - * @return true if this list contains no elements - */ - @Override public boolean isEmpty() { - return size == 0; - } - - /** - * Returns true if this list contains the specified element. More formally, returns true if and - * only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)). - * - * @param o element whose presence in this list is to be tested - * @return true if this list contains the specified element - */ - @Override public boolean contains(Object o) { - return indexOf(o) >= 0; - } - - /** - * Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not - * contain the element. More formally, returns the lowest index i such that - * (o==null ? get(i)==null : o.equals(get(i))), or -1 if there is no such index. - */ - @Override public int indexOf(Object o) { - if (o instanceof Integer) { - for (int i = 0; i < size; i++) { - if (o.equals(elementData[i])) { - return i; - } - } - } - return -1; - } - - /** - * Returns the index of the last occurrence of the specified element in this list, or -1 if this list does not - * contain the element. More formally, returns the highest index i such that - * (o==null ? get(i)==null : o.equals(get(i))), or -1 if there is no such index. - */ - @Override public int lastIndexOf(Object o) { - if (o instanceof Integer) { - for (int i = size - 1; i >= 0; i--) - if (o.equals(elementData[i])) - return i; - } - return -1; - } - - /** - * Returns a shallow copy of this ArrayList instance. (The elements themselves are not copied.) - * - * @return a clone of this ArrayList instance - */ - @Override public Object clone() { - try { - @SuppressWarnings("unchecked") - IntegerArrayList v = (IntegerArrayList) super.clone(); - v.elementData = Arrays.copyOf(elementData, 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 proper sequence (from first to last element). - *

- *

The returned array will be "safe" in that no references to it are maintained by this list. (In other words, - * this method must allocate a new array). The caller is thus free to modify the returned array. - *

- *

This method acts as bridge between array-based and collection-based APIs. - * - * @return an array containing all of the elements in this list in proper sequence - */ - @Override public Object[] toArray() { - Integer[] array = new Integer[size]; - for (int i = 0; i < size; i++) { - array[i] = elementData[i]; - } - return array; - } - - /** - * Returns an array containing all of the elements in this list in proper sequence (from first to last element); the - * runtime type of the returned array is that of the specified array. If the list fits in the specified array, it - * is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the - * size of this list. - *

- *

- *

The returned list iterator is fail-fast. - * - * @throws IndexOutOfBoundsException {@inheritDoc} - */ - @Override public ListIterator listIterator(int index) { - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("Index: " + index); - return new ListItr(index); - } - - /** - * Returns a list iterator over the elements in this list (in proper sequence). - *

- *

The returned list iterator is fail-fast. - * - * @see #listIterator(int) - */ - @Override public ListIterator listIterator() { - return new ListItr(0); - } - - /** - * Returns an iterator over the elements in this list in proper sequence. - *

- *

The returned iterator is fail-fast. - * - * @return an iterator over the elements in this list in proper sequence - */ - @Override public Iterator iterator() { - return new Itr(); - } - - /** An optimized version of AbstractList.Itr */ - private class Itr implements Iterator { - int cursor; // index of next element to return - int lastRet = -1; // index of last element returned; -1 if no such - int expectedModCount = modCount; - - @Override public boolean hasNext() { - return cursor != size; - } - - @SuppressWarnings("unchecked") - @Override public Integer next() { - checkForComodification(); - int i = cursor; - if (i >= size) - throw new NoSuchElementException(); - int[] elementData = IntegerArrayList.this.elementData; - if (i >= elementData.length) - throw new ConcurrentModificationException(); - cursor = i + 1; - return (Integer) elementData[lastRet = i]; - } - - @Override public void remove() { - if (lastRet < 0) - throw new IllegalStateException(); - checkForComodification(); - - try { - IntegerArrayList.this.remove(lastRet); - cursor = lastRet; - lastRet = -1; - expectedModCount = modCount; - } catch (IndexOutOfBoundsException ex) { - throw new ConcurrentModificationException(); - } - } - - final void checkForComodification() { - if (modCount != expectedModCount) - throw new ConcurrentModificationException(); - } - } - - /** An optimized version of AbstractList.ListItr */ - private class ListItr extends Itr implements ListIterator { - ListItr(int index) { - super(); - cursor = index; - } - - @Override public boolean hasPrevious() { - return cursor != 0; - } - - @Override public int nextIndex() { - return cursor; - } - - @Override public int previousIndex() { - return cursor - 1; - } - - @SuppressWarnings("unchecked") - @Override public Integer previous() { - checkForComodification(); - int i = cursor - 1; - if (i < 0) - throw new NoSuchElementException(); - int[] elementData = IntegerArrayList.this.elementData; - if (i >= elementData.length) - throw new ConcurrentModificationException(); - cursor = i; - return (Integer) elementData[lastRet = i]; - } - - @Override public void set(Integer e) { - if (lastRet < 0) - throw new IllegalStateException(); - checkForComodification(); - - try { - IntegerArrayList.this.set(lastRet, e); - } catch (IndexOutOfBoundsException ex) { - throw new ConcurrentModificationException(); - } - } - - @Override public void add(Integer e) { - checkForComodification(); - - try { - int i = cursor; - IntegerArrayList.this.add(i, e); - cursor = i + 1; - lastRet = -1; - expectedModCount = modCount; - } catch (IndexOutOfBoundsException ex) { - throw new ConcurrentModificationException(); - } - } - } - - /** - * Returns a view of the portion of this list between the specified {@code fromIndex}, inclusive, and {@code - * toIndex}, exclusive. (If {@code fromIndex} and {@code toIndex} are equal, the returned list is empty.) The - * returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, - * and vice-versa. The returned list supports all of the optional list operations. - *

- *

This method eliminates the need for explicit range operations (of the sort that commonly exist for arrays). - * Any operation that expects a list can be used as a range operation by passing a subList view instead of a whole - * list. For example, the following idiom removes a range of elements from a list: - *

```-     *      list.subList(from, to).clear();
-     * ```
- * Similar idioms may be constructed for {@link #indexOf(Object)} and {@link #lastIndexOf(Object)}, and all of the - * algorithms in the {@link Collections} class can be applied to a subList. - *

- *