https://www.jb51.net/article/124990.htm
这篇文章主要介绍了ArrayList在for循环中使用remove方法移除元素的内容,介绍了具体代码实现,需要的朋友可以参考下。
有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | List<Integer> list = new ArrayList<Integer>(); list.add( 0 ); list.add( 1 ); list.add( 2 ); list.add( 3 ); list.add( 4 ); list.add( 5 ); list.add( 6 ); list.add( 7 ); //正常循环 for ( int i = 0 ; i < list.size(); i++) { System.out.println( "i的值:" + i + " 对应的数字:" + list.get(i)); } System.out.println( "没有remove前list的项:" +list.size()); //边循环边删除 for ( int i = 0 ; i < list.size(); i++) { System.out.println( "i的值:" + i + " 对应的数字:" + list.get(i)); if (list.get(i) == 3 ) list.remove(list.get(i)); //删除list的第四项 } System.out.println( "remove后list的项:" +list.size()); System.out.println( "==========remove后的list==========" ); for ( int i = 0 ; i < list.size(); i++) { System.out.println( "i的值:" + i + " 对应的数字:" + list.get(i)); } |
执行代码, 结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | i的值: 0 对应的数字: 0 i的值: 1 对应的数字: 1 i的值: 2 对应的数字: 2 i的值: 3 对应的数字: 3 i的值: 4 对应的数字: 4 i的值: 5 对应的数字: 5 i的值: 6 对应的数字: 6 i的值: 7 对应的数字: 7 没有remove前list的项: 8 i的值: 0 对应的数字: 0 i的值: 1 对应的数字: 1 i的值: 2 对应的数字: 2 i的值: 3 对应的数字: 3 i的值: 4 对应的数字: 5 i的值: 5 对应的数字: 6 i的值: 6 对应的数字: 7 remove后list的项: 7 ==========remove后的list========== i的值: 0 对应的数字: 0 i的值: 1 对应的数字: 1 i的值: 2 对应的数字: 2 i的值: 3 对应的数字: 4 i的值: 4 对应的数字: 5 i的值: 5 对应的数字: 6 i的值: 6 对应的数字: 7 |
可以看到没有删除前, 我们的list的项和循环对应的数字都是正确的, 但是下面的循环在删除第4个元素后,第4,5,6个项对应的数字本应该是4,5,6, 但是这里却变成了5,6,7.
原因是,我们删除第4项后,list的长度就变成7,而且,list会把第4项后面的值往前移一位, 也就是说,i=3时,list.get(i)=4,i=4时,list.get(i)=5,i=5时,list.get(i)=6,i=6时,list.get(i)=7.. 我们再说的形象一点, 就是本来有8层糕点,依次是0-7,竖起来,大的在上,小的在下,我们从下往上数,数到第5个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层
所以, 值为4的项我们根本没有循环到
那有什么方法可以实现remove呢, 有个笨方法,是新建一个tempList, 把要删除的项全部add进去,最后用list.removeAll(tempList)实现 . 但是这里我们有更好的方法, 就是倒序删除
还是上面的例子, 我们看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | List<Integer> list = new ArrayList<Integer>(); list.add( 0 ); list.add( 1 ); list.add( 2 ); list.add( 3 ); list.add( 4 ); list.add( 5 ); list.add( 6 ); list.add( 7 ); //正常循环 for ( int i = 0 ; i < list.size(); i++) { System.out.println( "i的值:" + i + " 对应的数字:" + list.get(i)); } System.out.println( "没有remove前list的项:" +list.size()); //边循环边删除 for ( int i = list.size() - 1 ; i >= 0 ; i--) { System.out.println( "i的值 " + i + " 对应的数字 " + list.get(i)); if (list.get(i) == 3 ) list.remove(list.get(i)); } System.out.println( "remove后list的项:" +list.size()); System.out.println( "==========remove后的list==========" ); for ( int i = 0 ; i < list.size(); i++) { System.out.println( "i的值 " + i + " 对应的数字 " + list.get(i)); } |
执行代码,结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | i的值: 0 对应的数字: 0 i的值: 1 对应的数字: 1 i的值: 2 对应的数字: 2 i的值: 3 对应的数字: 3 i的值: 4 对应的数字: 4 i的值: 5 对应的数字: 5 i的值: 6 对应的数字: 6 i的值: 7 对应的数字: 7 没有remove前list的项: 8 i的值 7 对应的数字 7 i的值 6 对应的数字 6 i的值 5 对应的数字 5 i的值 4 对应的数字 4 i的值 3 对应的数字 3 i的值 2 对应的数字 2 i的值 1 对应的数字 1 i的值 0 对应的数字 0 remove后list的项: 7 ==========remove后的list========== i的值 0 对应的数字 0 i的值 1 对应的数字 1 i的值 2 对应的数字 2 i的值 3 对应的数字 4 i的值 4 对应的数字 5 i的值 5 对应的数字 6 i的值 6 对应的数字 7 |
我们可以看到变循环变删除,并不影响后面的元素, remove后的list也和第一次的结果是一样的 . 这是因为我们删除list元素,list的长度是会变小, 但是变化的只是比当前被删除元素的项大的项, 而我们这里使用倒序循环, 大的项, 我们已经执行过了, 所以不会影响.. 再用上面的比喻来说明,这次我们是从上往下数,数到第4个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层 , 但是这不影响我们之前数过的蛋糕, 而且对下面的蛋糕也不影响, 这就是原理
总结
以上就是本文关于ArrayList在for循环中使用remove方法移除元素方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:Java实现跳跃表(skiplist)的简单实例 Java多线程ForkJoinPool实例详解 等。感谢朋友们对脚本之家网站的支持。有什么问题或者想要了解的可以随时给我们留言,小编会及时回复大家的。
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li><a href="/article/25489.htm" title="关于Ext中form移除textfield方法:hide(),setVisible(false),remove()" target="_blank">关于Ext中form移除textfield方法:hide(),setVisible(false),remove()</a></li><li><a href="/article/22807.htm" title="ExtJS TabPanel beforeremove beforeclose使用说明" target="_blank">ExtJS TabPanel beforeremove beforeclose使用说明</a></li></ul>
</div>
</div>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)