import java.util.Iterator;
public class MyArrayList<E> implements Iterable<E> {
    public static final int DEFAULT_SIZE = 5;
    public static final int EXPANSION = 5;
    private int capacity;
    private int size;
    private Object[] items;
    public MyArrayList() {
        size = 0;
        capacity = DEFAULT_SIZE;
        items = new Object[DEFAULT_SIZE];
    }
    private void expand() {
        Object[] newItems = new Object[capacity + EXPANSION];
        for (int j = 0; j < size; j++) newItems[j] = items[j];
        items = newItems;
        capacity = capacity + EXPANSION;
    }
    public void add(Object obj) {
        if (size >= capacity) this.expand();
        items[size] = obj;
        size++;
    }
    public int size() {
        return size;
    }
    public Object get(int index) {
        try{
            return items[index];
            } catch(IndexOutOfBoundsException e){
                System.out.println("Exception Thrown: " + "Index is out of bound");
            }
            return index;
    }
    public boolean contains(Object obj) {
        for (int j = 0; j < size; j++) {
            if (obj.equals(this.get(j))) return true;
        }
        return false;
    }
    public void add(int index, Object obj) {
        try{
            if (size >= capacity) this.expand();
            for (int j = size; j > index; j--) items[j] = items[j - 1];
            items[index] = obj;
            size++;
              } catch(IndexOutOfBoundsException e){
                System.out.println("Exception Thrown: " + "Index is out of bound");
              }
            return;
    }
    public int indexOf(Object obj) {
        for (int j = 0; j < size; j++) {
            if (obj.equals(this.get(j))) return j;
        }
        return -1;
    }
    public boolean remove(Object obj) { 
        for (int j = 0; j < size; j++) {
            if (obj.equals(this.get(j))) {
                for (int k = j; k < size-1; k++) items[k] = items[k + 1];
                size--;
                items[size] = null;
                return true;
            }
        }
        return false;
    }
    public Object remove(int index) {
        try{
            Object result = this.get(index);
            for (int k = index; k < size-1; k++) items[k] = items[k + 1];
            items[size] = null;
            size--;
            return result;
             } catch(IndexOutOfBoundsException e){
                System.out.println("Exception Thrown: " + "Index is out of bound");
              }
            return index;
    }
    public void set(int index, Object obj) {
        try{
            items[index] = obj;
             } catch(IndexOutOfBoundsException e){
                System.out.println("Exception Thrown: " + "Index is out of bound");
             }
            return;
    }
public Iterator<E> iterator() {
    return new MyIterator<E>();
}
public class MyIterator <T> implements Iterator<T>{
    public boolean hasNext(){
    }
public T next(){
}
public void remove(){
    }
}
}
Basically I'm trying to improve the functionality of my arraylist, as it uses for loops for methods such as add and remove, however I am trying to use an iterator instead and I searched it up and I found out you cannot just simply add implements iterable to the main class, it has to be implemented by using three methods next(), hasNext() and remove(). I added the three methods at the bottom of the code but i'm really not sure how I implement it in order for it to begin to work.
