package com.gdcct; public class RemoveList { String str1 = new String("abcde"); String str2 = new String("abcde"); String str3 = new String("abcde"); String str4 = new String("abcde"); String str5 = new String("abcde"); List list = new ArrayList(); list.add(str1); list.add(str2); list.add(str3); list.add(str4); list.add(str5); System.out.println("list.size()=" + list.size()); for (int i = 0; i < list.size(); i++) { if (((String) list.get(i)).startsWith("abcde")) { list.remove(i); } // 运行结果不是: list.size()=5 after remove:list.size()=0 // 居然是: list.size()=5 after remove:list.size()=2 // 原因:List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。 // 解决方法: // 1.倒过来遍历list for (int i = list.size()-1; i > =0; i--) { if (((String) list.get(i)).startsWith("abcde")) { list.remove(i); } } // 2.每移除一个元素以后再把i移回来 for (int i = 0; i < list.size(); i++) { if (((String) list.get(i)).startsWith("abcde")) { list.remove(i); i=i-1; } } 3.使用iterator.remove()方法删除 for (Iterator it = list.iterator(); it.hasNext();) { String str = (String)it.next(); if (str.equals("chengang")){ it.remove(); } } } System.out.println("after remove:list.size()=" + list.size()); } } }