首先上一段代码:
needDelete()方法:决定是否要删除


public static boolean needDelete(Object obj) {
        if (obj.equals("1"))
            return true;
        else
            return false;
    }

方案一运行:

public static void main(String[] args) {`
   List list = new ArrayList();
          list.add("1");
          list.add("2");
          list.add("2");
          list.add("1");
          list.add("1");
          list.add("2");
          list.add("1");
          Iterator it = list.iterator();
          while (it.hasNext()) {
             Object obj = it.next();
              if (needDelete(obj))  //needDelete返回boolean,决定是否要删除
              {
                  it.remove();
              }
         }
         System.out.println(list.toString());
}

此处的输出结果为:[2, 2, 2]

 public static void main(String[] args) {
        List list = new ArrayList();
        list.add("1");
        list.add("2");
        list.add("2");
        list.add("1");
        list.add("1");
        list.add("2");
        list.add("1");

        for (int i=0;i<list.size();i++) {
                    if(needDelete(list.get(i))){
                        list.remove(i);
                    }
                }
        System.out.println(list.toString());

输出结果为:[2, 2, 1, 2]

由此可见:Iterator迭代器( it.remove())能够将集合中全部不想要的数据删除,即数据安全,而简单的用for循环+list.remove(i)却删漏了(即数据不安全)

那么如果我们实在想用for循环又该怎么办呢?
解决方案如下:


for (int i=0;i<list.size();i++) {
            if(needDelete(list.get(i))){
                list.remove(i);
                i--;//加上这一句,就能实现不删漏啦~
            }
        }

        System.out.println(list.toString());[2, 2, 2]

解释:为什么写一个 i-- 就能解决问题呢?这是因为list集合中的ArrayList是一个有序的集合,当我们删除某个元素之后,这个元素后面的元素的下标将会向前推进一个,我们只要能拿到删除后的集合元素的下标也可以实现不漏删。
进一步说明:
现在有这样一个集合: [1,2,3,4,5,6,7]
然后我们删除下标为4的元素得到: [1,2,3,4,6,7]
此时6,7这两个元素的下标发生了变化,下标减小了1
由此我们能够得到:只需要每次移除一个元素后把指定的下标退一(即i--)即可!