@Override
    public ListIterator<E> listIterator(final int index) {
        Object[] elements = getArray();
        int len = elements.length;
        if (index < 0 || index > len)
            throw new IndexOutOfBoundsException("Index: " + index);

        return new COWIterator<E>(elements, index);
    }
@ Override public ListIterator < E > listIterator ( final int index ) { Object [ ] elements = getArray ( ) ; int len = elements . length ; if ( index < 0 || index > len ) throw new IndexOutOfBoundsException ( "Index: " + index ) ; return new COWIterator < E > ( elements , index ) ; }
{@inheritDoc}

<p>The returned iterator provides a snapshot of the state of the list
when the iterator was constructed. No synchronization is needed while
traversing the iterator. The iterator does <em>NOT</em> support the
<tt>remove</tt>, <tt>set</tt> or <tt>add</tt> methods.

@throws IndexOutOfBoundsException {@inheritDoc}