java.util

Class AbstractSequentialList<E>

Implemented Interfaces:
Collection<E>, Iterable<E>, List<E>
Known Direct Subclasses:
LinkedList<T>

public abstract class AbstractSequentialList<E>
extends AbstractList<E>

Abstract superclass to make it easier to implement the List interface when backed by a sequential-access store, such as a linked list. For random access data, use AbstractList. This class implements the random access methods (get, set, add, and remove) atop the list iterator, opposite of AbstractList's approach of implementing the iterator atop random access.

To implement a list, you need an implementation for size() and listIterator. With just hasNext, next, hasPrevious, previous, nextIndex, and previousIndex, you have an unmodifiable list. For a modifiable one, add set, and for a variable-size list, add add and remove.

The programmer should provide a no-argument constructor, and one that accepts another Collection, as recommended by the Collection interface. Unfortunately, there is no way to enforce this in Java.

Since:
1.2
See Also:
Collection, List, AbstractList, AbstractCollection, ListIterator, LinkedList

Field Summary

Fields inherited from class java.util.AbstractList<E>

modCount

Constructor Summary

AbstractSequentialList()
The main constructor, for use by subclasses.

Method Summary

void
add(int index, E o)
Insert an element into the list at a given position (optional operation).
boolean
addAll(int index, E> c)
Insert the contents of a collection into the list at a given position (optional operation).
E
get(int index)
Get the element at a given index in this list.
Iterator
iterator()
Obtain an Iterator over this list, whose sequence is the list order.
abstract ListIterator
listIterator(int index)
Returns a ListIterator over the list, starting from position index.
E
remove(int index)
Remove the element at a given position in this list (optional operation).
E
set(int index, E o)
Replace an element of this list with another object (optional operation).

Methods inherited from class java.util.AbstractList<E>

add, add, addAll, clear, equals, get, hashCode, indexOf, iterator, lastIndexOf, listIterator, listIterator, remove, removeRange, set, subList

Methods inherited from class java.util.AbstractCollection<E>

T[] toArray, add, addAll, clear, contains, containsAll, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toString

Methods inherited from class java.lang.Object

clone, equals, extends Object> getClass, finalize, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructor Details

AbstractSequentialList

protected AbstractSequentialList()
The main constructor, for use by subclasses.

Method Details

add

public void add(int index,
                E o)
Insert an element into the list at a given position (optional operation). This shifts all existing elements from that position to the end one index to the right. This version of add has no return, since it is assumed to always succeed if there is no exception. This iteration uses listIterator(index).add(o).
Specified by:
add in interface List<E>
Overrides:
add in interface AbstractList<E>
Parameters:
index - the location to insert the item
o - the object to insert
Throws:
UnsupportedOperationException - if this list does not support the add operation
IndexOutOfBoundsException - if index < 0 || index > size()
ClassCastException - if o cannot be added to this list due to its type
IllegalArgumentException - if o cannot be added to this list for some other reason.
NullPointerException - if o is null and the list does not permit the addition of null values.

addAll

public boolean addAll(int index,
                      E> c)
Insert the contents of a collection into the list at a given position (optional operation). Shift all elements at that position to the right by the number of elements inserted. This operation is undefined if this list is modified during the operation (for example, if you try to insert a list into itself).

This implementation grabs listIterator(index), then proceeds to use add for each element returned by c's iterator. Sun's online specs are wrong, claiming that this also calls next(): listIterator.add() correctly skips the added element.

Specified by:
addAll in interface List<E>
Overrides:
addAll in interface AbstractList<E>
Parameters:
index - the location to insert the collection
c - the collection to insert
Returns:
true if the list was modified by this action, that is, if c is non-empty
Throws:
UnsupportedOperationException - if this list does not support the addAll operation
IndexOutOfBoundsException - if index < 0 || index > size()
ClassCastException - if some element of c cannot be added to this list due to its type
IllegalArgumentException - if some element of c cannot be added to this list for some other reason
NullPointerException - if the specified collection is null
NullPointerException - if an object, o, in c is null and the list does not permit the addition of null values.
See Also:
add(int, Object)

get

public E get(int index)
Get the element at a given index in this list. This implementation returns listIterator(index).next().
Specified by:
get in interface List<E>
Overrides:
get in interface AbstractList<E>
Parameters:
index - the index of the element to be returned
Returns:
the element at index index in this list
Throws:
IndexOutOfBoundsException - if index < 0 || index >= size()

iterator

public Iterator iterator()
Obtain an Iterator over this list, whose sequence is the list order. This implementation returns listIterator().
Specified by:
iterator in interface List<E>
iterator in interface Collection<E>
iterator in interface Iterable<E>
Overrides:
iterator in interface AbstractList<E>
Returns:
an Iterator over the elements of this list, in order

listIterator

public abstract ListIterator listIterator(int index)
Returns a ListIterator over the list, starting from position index. Subclasses must provide an implementation of this method.
Specified by:
listIterator in interface List<E>
Overrides:
listIterator in interface AbstractList<E>
Parameters:
index - the starting position of the list
Returns:
the list iterator
Throws:
IndexOutOfBoundsException - if index < 0 || index > size()

remove

public E remove(int index)
Remove the element at a given position in this list (optional operation). Shifts all remaining elements to the left to fill the gap. This implementation uses listIterator(index) and ListIterator.remove().
Specified by:
remove in interface List<E>
Overrides:
remove in interface AbstractList<E>
Parameters:
index - the position within the list of the object to remove
Returns:
the object that was removed
Throws:
UnsupportedOperationException - if this list does not support the remove operation
IndexOutOfBoundsException - if index < 0 || index >= size()

set

public E set(int index,
             E o)
Replace an element of this list with another object (optional operation). This implementation uses listIterator(index) and ListIterator.set(o).
Specified by:
set in interface List<E>
Overrides:
set in interface AbstractList<E>
Parameters:
index - the position within this list of the element to be replaced
o - the object to replace it with
Returns:
the object that was replaced
Throws:
UnsupportedOperationException - if this list does not support the set operation
IndexOutOfBoundsException - if index < 0 || index >= size()
ClassCastException - if o cannot be added to this list due to its type
IllegalArgumentException - if o cannot be added to this list for some other reason
NullPointerException - if o is null and the list does not allow a value to be set to null.

AbstractSequentialList.java -- List implementation for sequential access Copyright (C) 1998, 1999, 2000, 2001, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath 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 for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.