@Override
    public Object[] toArray() {
	// Estimate size of array; be prepared to see more or fewer elements
	Object[] r = new Object[size()];
	Iterator<E> it = iterator();
	for (int i = 0; i < r.length; i++) {
	    if (!it.hasNext()) // fewer elements than expected
		return Arrays.copyOf(r, i);
	    r[i] = it.next();
	}
	return it.hasNext() ? finishToArray(r, it) : r;
    }
@ Override public Object [ ] toArray ( ) { Object [ ] r = new Object [ size ( ) ] ; Iterator < E > it = iterator ( ) ; for ( int i = 0 ; i < r . length ; i ++ ) { if ( ! it . hasNext ( ) ) return Arrays . copyOf ( r , i ) ; r [ i ] = it . next ( ) ; } return it . hasNext ( ) ? finishToArray ( r , it ) : r ; }
{@inheritDoc}

<p>
This implementation returns an array containing all the elements returned by this collection's
iterator, in the same order, stored in consecutive elements of the array, starting with index
{@code 0}. The length of the returned array is equal to the number of elements returned by the
iterator, even if the size of this collection changes during iteration, as might happen if the
collection permits concurrent modification during iteration. The {@code size} method is called
only as an optimization hint; the correct result is returned even if the iterator returns a
different number of elements.

<p>
This method is equivalent to:

<pre>
{
&#64;code
List<E> list = new ArrayList<E>(size());
for (E e: this)
list.add(e);
return list.toArray();
}
</pre>