В общем на выходе кода получается 6 строковых элементов и 2 null. Мне нужно от них двух избавиться, но не знаю как. 2 null элемента создаются6 потому что работает expandStorage метод, то есть он автоматически расширяет список если там больше элементов, чем положено. И нужно ли мне как то дополнить мои методы класса Iterator или так тоже верно? Спасибо!
public class MyArrayList<T> {

    // instance variables
    private Object[] myData;
    private int size; // the number of data elements in the MyArrayList

    public MyArrayList() {
        this.myData = new Object[5];
        this.size = 0;
    }

    public int size() {
        return this.size;
    }

    public void add(T element) {
        if (size == myData.length)
            expandStorage();
        myData[size] = element;
        size++;
    }

    public void add(int index, T element) {
        // first, shuffle everything down, starting from the end
        // and working our way up to "index"
        for (int i = this.size; i > index; i--) {
            myData[i] = myData[i-1];
        }
        // so now at index, we should have a spot to place our new thing
        myData[index] = element;
        size++;
    }

    public T remove(int index) {
        // first, check that index is valid
        if (index >= this.size)
            throw new ArrayIndexOutOfBoundsException();

        T temp = (T) myData[index];

        for (int i = index; i < size; i++) {
            myData[i] = myData[i+1];
        }
        size--;
        return temp;
    }

    public T get(int index) {
        return (T) myData[index];

    }

    private void expandStorage() {
        int newsize = myData.length + (myData.length / 2) + 1;
        Object[] bigger = new Object[newsize];
        for (int i = 0; i < size; i++) {
            bigger[i] = myData[i];
        }
        myData = bigger;
    }

    public Iterator iterator() {

        return new Iterator();
    }

    // member (inner) class
    public class Iterator implements java.util.Iterator<T> {
        private int currentIndex;

        // constructor
        public Iterator() {
            currentIndex = 0;
        }

        // hasNext() should return true, if there is any value left in ArrayList
        // returns false if next element does not exist
        public boolean hasNext() {
            return currentIndex < myData.length;

//            if (currentIndex < myData.length)
//                return true;
//            else
//                return false;
        }

        // next() returns the element, move the iterator to the next value and so on
        public T next() {
            return (T) myData[currentIndex++];
        }
    }
} //end generic class MyArrayList
public class MyArrayListTest {
    public static void main(String[] args) {
        MyArrayList<String> names = new MyArrayList<>();
        names.add("Java");
        names.add("Python");
        names.add("C++");
        names.add("Swift");
        names.add("Kotlin");
        names.add("C#");

//        for (int i = 0; i < names.size(); i++) {
//            System.out.println(names.get(i));
//        }

        MyArrayList<String>.Iterator iterator = names.new Iterator();

        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}