zoukankan      html  css  js  c++  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

     

  • 相关阅读:
    C# DataGridview转换为DataTable
    未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序
    ORM(Object Relational Mapping)框架
    C#开发小技巧
    Windows系统中Oracle11g R2 版本数据库卸载
    world特殊控制符输入
    Java中生成帮助文档
    Java类——JDBC链接、并操作MySQL数据库
    Java——实现对密码进行MD5加密
    HTTP协议详解
  • 原文地址:https://www.cnblogs.com/biao2015/p/4491410.html
Copyright © 2011-2022 走看看