在处理List的时候,发现List在Remove后,List的下标索引和Size会发生变化。中与C#中的List有些区别。
public class test { public static void main(String[] args) { 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); } } System.out.println("after remove:list.size()=" + list.size()); } }
大家觉得这个程序打印出来的结果是多少呢?
Java代码
运行结果不是:
list.size()=5
after remove:list.size()=0
而是:
Java代码
list.size()=5
这是怎么回事呢?到底要如何remove list 中的元素呢?
原因:List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。
怎么解决?有三种方法可以解决这个问题:
1.倒过来遍历list Java代码 for (int i = list.size()-1; i > =0; i--) { if (((String) list.get(i)).startsWith("abcde")) { list.remove(i); } } 2.每移除一个元素以后再把i移回来 Java代码 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(); } }
after remove:list.size()=2