class ArrayList implements Iterable { private T[] _underlyingStorage = (T[]) Object[128]; private int _numElements = 0; public Iterator iterator () { return new ArrayListIterator(); } public void add (T o) { if (_numElements == _underlyingStorage.length) { // Grow array if necessary ... } _underlyingStorage[_numElements++] = o; } private class ArrayListIterator implements Iterator { // Write your code here... } } Complete the implementation of the ArrayListIterator inner-class shown above. It should behave in the following ways: hasNext() should return true if the list is non-empty; otherwise, it should return false. remove() should just throw an UnsupportedOperationExecption(). next() should function like the Iterator in the circular linked-list described during lecture -- once it gets to the end of the list, it should "loop back" to the beginning. For example, if the following code were executed: final ArrayList al = new ArrayList(); al.add(new Integer(1)); al.add(new Integer(2)); al.add(new Integer(4)); final Iterator iterator = al.iterator(); System.out.println(iterator.next()); System.out.println(iterator.next()); System.out.println(iterator.next()); System.out.println(iterator.next()); System.out.println(iterator.next()); then the program should output the numbers 1, 2, 4, 1, 2.