java中for循环删除集合陷阱
首先看下面的代码:
import java.util.LinkedList;
import java.util.List;
public class DeleteCollection {
public static void main(String[] args) {
List<String> list = new LinkedList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
for(int i=0;i<list.size();i++){ //循环删除集合中的元素
list.remove(i);
}
System.out.println("还剩余的元素个数:"+list.size());
}
}
上述的代码按照思路应该是对的,输出的结果也应该是0
看下面实际输出的结果:
还剩余的元素个数:2
你也许会问为什么呢?因为集合的大小是动态变化的,当你删除一个元素之后,元素中的序号又重新排列,原来第二个应该删除的元素现在排在了第一个元素的位置,真正删除的却是第三个元素,依次类推,删除的是第一个、第三个、第五个、、、、如果在原来删除的代码中加入语句:System.out.println("即将删除的元素:"+list.get(i));即可验证。
加入上述语句后输出的结果:
即将删除的元素:a
即将删除的元素:c
即将删除的元素:e
还剩余的元素个数:2
解决办法:
究其原因是因为你要删除的元素往前面移动了,而你的i保存的值依旧往后走,所以如果让i不往后走,往前走一个,即可删除本来排在第二个位置的元素现在排在了第一个位置上的元素。
更改后的核心代码:
for(int i=0;i<list.size();i++){
System.out.println("即将删除的元素:"+list.get(i));
list.remove(i);
i--;
}
结果:
即将删除的元素:a
即将删除的元素:b
即将删除的元素:c
即将删除的元素:d
即将删除的元素:e
还剩余的元素个数:0
以上所述就是本文的全部内容了,希望大家能够喜欢。
相关文章
mybatis注解动态sql注入map和list方式(防sql注入攻击)
这篇文章主要介绍了mybatis注解动态sql注入map和list方式(防sql注入攻击),具有很好的参考价值,希望对大家有所帮助。2021-11-11
java中LinkedList使用迭代器优化移除批量元素原理
本文主要介绍了java中LinkedList使用迭代器优化移除批量元素原理,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-10-10
shuffle的关键阶段sort(Map端和Reduce端)源码分析
今天小编就为大家分享一篇关于shuffle的关键阶段sort(Map端和Reduce端)源码分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-01-01


最新评论