String str1 = new String("1"); String str2 = new String("2"); String str3 = new String("3"); String str4 = new String("4"); String str5 = new String("5"); 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++) { list.remove(i); // i--; //System.out.println(i+" "+list.get(i)+" "); } System.out.println("after remove:list.size()=" + list.size());
原本预期结果应该是:java
list.size()=5 after remove:list.size()=0
但实际上结果倒是:app
list.size()=5 after remove:list.size()=2
缘由以下: List每remove掉一个元素之后,后面的元素都会向前移动 ,此时若是执行i++,则刚刚移过来的元素没有被读取。spa
分析:.net
List中有5条数据,须要循环5次,code
第一次数据为:1 2 3 4 5blog
执行完remove(0) 后,数据为 2 3 4 5 , i=1rem
第二次数据为:2 3 4 5get
执行完remove(1) 后,数据为 2 4 5 , i=2class
第三次数据为:2 4 5List
执行完remove(2) 后,数据为 2 4 , i=3
此时若是加上上面注释的代码 System.out.println(i+" "+list.get(i)+" "); 循环第四、5次时就会出现异常
解决方法1:
每移过一次后,再把 i 移回来
for (int i = 0; i < list.size(); i++) { list.remove(i); i--; }
解决方法2:
先删除后面的元素
for (int i = list.size()-1; i >= 0; i--) { list.remove(i); }
原文出处:
[1] cbjcry, 使用List中remove方法时须要注意的问题, https://blog.csdn.net/cbjcry/article/details/70154568
注:转载后,已经重复验证了分析过程以及解决方案的正确与有效。