zoukankan      html  css  js  c++  java
  • List元素删除不会导致越界但有问题的写法

    今天在论坛里看到一段请教list删除的问题,下面先看代码:

    	public static void main(String[] args) {
    		List<Integer> list = new ArrayList<Integer>(5);
    		list.add(1);
    		list.add(2);
    		list.add(3);
    		list.add(4);
    		list.add(5);
    
    		Integer target = 3;
    		for (int i = 0; i < list.size(); i++) {
    			if (target.equals(list.get(i))) {
    				list.remove(i);
    			}
    		}
    		System.out.println(list);
    	}
    

    读了一遍代码,“貌似”没有问题啊,由于是list.size(),每次都计算了下标的上界,并不会导致下标越界的异常。
    可是,仍然觉得那里不太对,要不然就不会有那么多前辈推荐使用迭代器的方式来删除元素了。
    看了下别人的回答,其中一位同仁点醒了我,我们修改下代码,可以看下结果:

    	public static void main(String[] args) {
    		List<Integer> list = new ArrayList<Integer>(5);
    		list.add(1);
    		list.add(2);
    		list.add(3);
    		list.add(4);
    		list.add(5);
    
    		Integer target = 3;
    		for (int i = 0; i < list.size(); i++) {
    			System.out.println(list.get(i));
    			if (target.equals(list.get(i))) {
    				list.remove(i);
    			}
    		}
    		System.out.println(list);
    	}
    

    运行结果:

    1
    2
    3
    5
    [1, 2, 4, 5]
    

    可以看出,在删除时,下一次循环取到的值为5,不是我们以为的4啊!!!
    我们知道,ArrayList的底层实现是一个数组,在删除元素后,会调用native方法将删除元素后面的元素一起向前移动一位。对应于例子中的代码,在删除3后,下标为2的位置被替换成了4,下标为3的位置上被替换成了5(后面的元素统统向前移动一位),而在删除目标元素3时,i=2,在下一次的循环汇总i=3,而此时下标为3的位置上的元素是5,4在不注意见逃过了验证。

    这次逛论坛,遇到这个问题,发现自己基础知识还行,但是思考问题的方式还是不够,看问题不够细致,以后工作中要时刻注意。

  • 相关阅读:
    hdu6229 Wandering Robots 2017沈阳区域赛M题 思维加map
    hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)
    hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心
    hdu6441 Find Integer 求勾股数 费马大定理
    bzoj 1176 Mokia
    luogu 3415 祭坛
    bzoj 1010 玩具装箱
    bzoj 3312 No Change
    luogu 3383【模板】线性筛素数
    bzoj 1067 降雨量
  • 原文地址:https://www.cnblogs.com/acode/p/7476950.html
Copyright © 2011-2022 走看看