org.apache.commons.collections.list
public class CursorableLinkedList extends AbstractLinkedList implements Serializable
List
implementation with a ListIterator
that
allows concurrent modifications to the underlying list.
This implementation supports all of the optional List operations.
It extends AbstractLinkedList
and thus provides the
stack/queue/dequeue operations available in java.util.LinkedList.
The main feature of this class is the ability to modify the list and the
iterator at the same time. Both the listIterator and cursor
methods provides access to a Cursor
instance which extends
ListIterator
. The cursor allows changes to the list concurrent
with changes to the iterator. Note that the iterator method and
sublists do not provide this cursor behaviour.
The Cursor
class is provided partly for backwards compatibility
and partly because it allows the cursor to be directly closed. Closing the
cursor is optional because references are held via a WeakReference
.
For most purposes, simply modify the iterator and list at will, and then let
the garbage collector to the rest.
Note that this implementation is not synchronized.
Since: Commons Collections 1.0
Version: $Revision: 348013 $ $Date: 2005-11-21 23:24:45 +0000 (Mon, 21 Nov 2005) $
See Also: java.util.LinkedList
Nested Class Summary | |
---|---|
static class | CursorableLinkedList.Cursor
An extended ListIterator that allows concurrent changes to
the underlying list. |
protected static class | CursorableLinkedList.SubCursor
A cursor for the sublist based on LinkedSubListIterator.
|
Field Summary | |
---|---|
protected List | cursors A list of the cursor currently open on this list |
Constructor Summary | |
---|---|
CursorableLinkedList()
Constructor that creates. | |
CursorableLinkedList(Collection coll)
Constructor that copies the specified collection
|
Method Summary | |
---|---|
protected void | addNode(Node nodeToInsert, Node insertBeforeNode)
Inserts a new node into the list.
|
protected void | broadcastNodeChanged(Node node)
Informs all of my registered cursors that the specified
element was changed.
|
protected void | broadcastNodeInserted(Node node)
Informs all of my registered cursors that the specified
element was just added to my list.
|
protected void | broadcastNodeRemoved(Node node)
Informs all of my registered cursors that the specified
element was just removed from my list.
|
protected ListIterator | createSubListListIterator(LinkedSubList subList, int fromIndex)
Creates a list iterator for the sublist.
|
CursorableLinkedList.Cursor | cursor()
Returns a Cursor for iterating through the elements of this list.
|
CursorableLinkedList.Cursor | cursor(int fromIndex)
Returns a Cursor for iterating through the elements of this list
starting from a specified index.
|
protected void | init()
The equivalent of a default constructor called
by any constructor and by readObject . |
Iterator | iterator()
Returns an iterator that does not support concurrent modification.
|
ListIterator | listIterator()
Returns a cursor iterator that allows changes to the underlying list in parallel.
|
ListIterator | listIterator(int fromIndex)
Returns a cursor iterator that allows changes to the underlying list in parallel.
|
protected void | registerCursor(CursorableLinkedList.Cursor cursor)
Registers a cursor to be notified of changes to this list.
|
protected void | removeAllNodes()
Removes all nodes by iteration. |
protected void | removeNode(Node node)
Removes the specified node from the list.
|
protected void | unregisterCursor(CursorableLinkedList.Cursor cursor)
Deregisters a cursor from the list to be notified of changes.
|
protected void | updateNode(Node node, Object value)
Updates the node with a new value.
|
Parameters: coll the collection to copy
Parameters: nodeToInsert new node to insert insertBeforeNode node to insert before
Throws: NullPointerException if either node is null
Parameters: node the node that was changed
Parameters: node the node that was changed
Parameters: node the node that was changed
Parameters: subList the sublist to get an iterator for fromIndex the index to start from, relative to the sublist
A Cursor
is a ListIterator
with an additional
close()
method. Calling this method immediately discards the
references to the cursor. If it is not called, then the garbage collector
will still remove the reference as it is held via a WeakReference
.
The cursor enables iteration and list changes to occur in any order without invalidating the iterator (from one thread). When elements are added to the list, an event is fired to all active cursors enabling them to adjust to the change in the list.
When the "current" (i.e., last returned by ListIterator#next or ListIterator#previous) element of the list is removed, the cursor automatically adjusts to the change (invalidating the last returned value such that it cannot be removed).
The listIterator method returns the same as this method, and can
be cast to a Cursor
if the close
method is required.
Returns: a new cursor iterator
A Cursor
is a ListIterator
with an additional
close()
method. Calling this method immediately discards the
references to the cursor. If it is not called, then the garbage collector
will still remove the reference as it is held via a WeakReference
.
The cursor enables iteration and list changes to occur in any order without invalidating the iterator (from one thread). When elements are added to the list, an event is fired to all active cursors enabling them to adjust to the change in the list.
When the "current" (i.e., last returned by ListIterator#next or ListIterator#previous) element of the list is removed, the cursor automatically adjusts to the change (invalidating the last returned value such that it cannot be removed).
The CursorableLinkedList method returns the same as this method, and can
be cast to a Cursor
if the close
method is required.
Parameters: fromIndex the index to start from
Returns: a new cursor iterator
Throws: IndexOutOfBoundsException if the index is out of range (index < 0 || index > size()).
readObject
.If the underlying list is modified while iterating using this iterator a ConcurrentModificationException will occur. The cursor behaviour is available via listIterator.
Returns: a new iterator that does not support concurrent modification
The cursor enables iteration and list changes to occur in any order without invalidating the iterator (from one thread). When elements are added to the list, an event is fired to all active cursors enabling them to adjust to the change in the list.
When the "current" (i.e., last returned by ListIterator#next or ListIterator#previous) element of the list is removed, the cursor automatically adjusts to the change (invalidating the last returned value such that it cannot be removed).
Returns: a new cursor iterator
The cursor enables iteration and list changes to occur in any order without invalidating the iterator (from one thread). When elements are added to the list, an event is fired to all active cursors enabling them to adjust to the change in the list.
When the "current" (i.e., last returned by ListIterator#next or ListIterator#previous) element of the list is removed, the cursor automatically adjusts to the change (invalidating the last returned value such that it cannot be removed).
Parameters: fromIndex the index to start from
Returns: a new cursor iterator
Parameters: cursor the cursor to register
Parameters: node the node to remove
Throws: NullPointerException if node
is null
Parameters: cursor the cursor to deregister
Parameters: node node to update value new value of the node