code: @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;
      }
docs: {@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>