1、for循环遍历list
public static void main(String[] args) {
List list = new ArrayList();
list.add("asdf");
list.add("我多想");
list.add("我多想");
list.add("一少年");
list.add(1);
System.out.println(list);
for (int i = 0;i<list.size();i++)
{
System.out.println(list.get(i));
//删除目标元素时,size-1,后续的元素位置前移,导致后续的元素位置改变。不能完整输出整个序列。
//在测试中虽然得到正确的结果但是少扫描了元素,故新加测试例子,在list重复元素在一起遍历就会出现问题
if(list.get(i).equals("我多想"))
{
list.remove(i);
}
System.out.println(">>>>>>>>"+list.size());
}
System.out.println(list);
}
输出结果如下图:
应该将 我多想 这个元素都删除掉,没成功,list中的元素前移导致没有将所有元素都遍历
结论:这种方式的问题在于,删除某个元素后,后面的元素数组元素下标向前挪一位,所以会导致你在遍历的时候漏掉删除元素的后一个元素。
2.foreach删除
从源码中看出有个modCount计数器,在使用foreach遍历删除元素之前将当时的修改次数纪录到expectedModCount,删除元素后modCount++,导致抛出异常。
3.迭代器删除指定元素
代码如下
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("name");
list.add("哈哈");
list.add("name");
list.add("name");
list.add("java");
//目标删除指定元素name
Iterator<String> it = list.iterator();
while(it.hasNext()){
String item = it.next();
if (item.equals("name")){
it.remove();
}
}
System.out.println(list);
}
迭代器可以很好的删除指定元素
总结:for循环、foreach都不能用来删除指定元素,可以通过迭代器来删除指定的元素