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

     

  • 相关阅读:
    Windows性能计数器应用
    Azure Oracle Linux VNC 配置
    Azure 配置管理系列 Oracle Linux (PART6)
    Azure 配置管理系列 Oracle Linux (PART5)
    Azure 配置管理系列 Oracle Linux (PART4)
    Azure 配置管理系列 Oracle Linux (PART3)
    Azure 配置管理系列 Oracle Linux (PART2)
    vagrant多节点配置
    docker基本操作
    LINUX开启允许对外访问的网络端口命令
  • 原文地址:https://www.cnblogs.com/biao2015/p/4491410.html
Copyright © 2011-2022 走看看