Java List(ArrayList初始化)删除元素

本文探讨了使用ArrayList初始化的List对象删除元素时可能遇到的问题,并提供了两种解决方案:一种是从后往前遍历删除;另一种是使用ListIterator进行删除,推荐后者以避免索引偏移带来的错误。

Java List(ArrayList初始化)删除元素

概述

​ 对于使用ArrayList初始化的List对象,在进行删除元素时,可能会出现一些无法预料到的问题,就像这样一段代码:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<Integer> lst = new ArrayList<Integer>(); 
    lst.add(1); 
    lst.add(2); 
    lst.add(2); 
    lst.add(3); 
    lst.add(4); 
    lst.add(5); 
    for (int i = 0; i < lst.size(); ++i) {
      if (lst.get(i) == 2) {
        lst.remove(i); 
      }
    }
    for (int i = 0; i < lst.size(); ++i) {
      System.out.println("lst has: " + lst.get(i));
    }
}

​ 如果不了解remove的行为,可能会认为lst中将没有2这个元素了,其实不然,结果与预料的不太一样:

lst has: 1

lst has: 2

lst has: 3

lst has: 4

lst has: 5

​ 出现这个问题的原因是由于remove之后,后面的元素会往前移动,所以之后索引对应的元素就改变了,那么之后的操作也是不是在我们原先预想的对象上进行了。简单的解决办法:也可以从后往前遍历,如此,即使元素向前移动,也不会影响到原先索引对应的元素了,不过这种方法也不是很好,这里则可以使用一个更为推荐的做法。

使用List Iterator进行删除

​ 使用Iterator的好处是,remove行为操作在哪个对象上更加清晰。这里要注意,一定是要调用Iterator的remove方法,而不是List的remove方法。具体代码如下:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<Integer> lst = new ArrayList<Integer>(); 
    lst.add(1); 
    lst.add(2); 
    lst.add(2); 
    lst.add(3); 
    lst.add(4); 
    lst.add(5); 

    Iterator<Integer> it = lst.iterator(); 
    while (it.hasNext()) {
      Integer val = it.next(); 
      if (val == 2) {
        it.remove(); 
      }
    }

    for (int i = 0; i < lst.size(); ++i) {
      System.out.println("lst has: " + lst.get(i));
    }
}

​ 相应的结果如下:

lst has: 1

lst has: 3

lst has: 4

lst has: 5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值