Java代码ArrayList删除其中值的问题,请看下面的代码有问题么?

//删除集合中的偶数数据
List arr = new ArrayList();
for(int i = 0; i < 20; i++){
arr.add(i);
}

    for(int i = 0; i <arr.size() ; i++){
        if(arr.get(i)%2==0){
            arr.remove(i);
        }
    }
    for(int i = 0; i < arr.size(); i++){
        System.out.print(arr.get(i)+" ");
    }

以上的代码是否有问题?是不是出了越界的异常?应该改成这样么?
List arr = new ArrayList();
for(int i = 0; i < 20; i++){
arr.add(i);
}

    for(int i = 0; i <arr.size() ; i++){
        if(arr.get(i)%2==0){
            arr.remove(i);
            i--;                //加上这一句是否就没问题了?
        }
    }
    for(int i = 0; i < arr.size(); i++){
        System.out.print(arr.get(i)+" ");
    }
    @Test
public void deleteEven() {
    List<Integer> arr = new ArrayList<Integer>();
    System.out.println("删除前数组:");
    for (int i = 0; i < 20; i++) {
        arr.add(i);
        System.out.print(i + ",");
    }
    System.out.println();

    for (int i = 0; i < arr.size(); i++) {
        if (arr.get(i) % 2 == 0) {
            arr.remove(i);
        }
    }
    System.out.println("删除后数组:");
    for (int i = 0; i < arr.size(); i++) {
        System.out.print(arr.get(i) + ",");
    }
}

删除前数组:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
删除后数组:
1,3,5,7,9,11,13,15,17,19,

删除,不要重头往后遍历,要从后往前遍历

尽量不要在List遍历的同时操作List元素,因为list.size()在变化,推荐使用迭代器操作数据

list下标问题,remove后下标会后移 如果不减1的话 会下标越界。 可以看看list的基础知识