В первом цикле for,
for (int i = 0; i < array.size(); i++) {
if (array.get(i) == conditionMet) array.remove(i);
}
условие ; i < array.size();
оценивается в самом начале, которое примет размер исходного списка.Таким образом, при выполнении итерации по нему, если вы удаляете из него какой-либо элемент, размер уменьшается, но вы все равно продолжаете итерацию до исходного размера, что, очевидно, неверно.
Во втором цикле for,
for (Iterator<T> i = array.iterator(); i.hasNext();) {
if (i.next() == conditionMet) i.remove();
}
, так как вы используете итератор, вы проверяете, остался ли элемент в списке или нет.следовательно, вы не переступаете и это работает должным образом.
(Вы должны были включить исключение в вопрос. "Исключение в потоке" main "java.lang.IndexOutOfBoundsException")