Java循环中remove方法的使用

Java循环中remove方法的使用

首先看下如下代码

public class Test
{
public static void main(String[] args)
{
List<String> ll = new ArrayList();
ll.add("1");
ll.add("2");
ll.add("3");
ll.add("4");
ll.add("5");
ll.add("6");
for (String value : ll)
{
if ("3".equals(value))
{
ll.remove(value);
}
}
System.out.println(ll);
}
}

目测打印的结果应该是[1, 2, 4, 5, 6],但运行的时候报ConcurrentModificationException

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at com.model.proxy.Test.main(Test.java:17)

原因

对于for(),java 虚拟机会将其翻译成Iterator迭代器,
java编译器中含有:hasNext()函数,而hasNext()函数中含有:size()函数,这意味着list数组的大小是动态生成的,它是使用index!=size()来判定是否有下一个元素的,理论上只有最后元素才回返回false,其它元素都会返回true,一旦返回了true就会调用next,这样在调用next的过程中就会调用concurrentExceptions,在for()中,不容许调用remove()函数。这也就解释了,删除倒数第二个数,不会导致报错,因为在判断倒数第二个数的时候,index!=size直接返回false,这样没有next
,也就不存在next的调用了。

解决方案

一.比较笨的一个方法,再新建一个list,将需要删除的元素放到新建的list中,然后调用原来list的removeAll()方法

public class Test
{
public static void main(String[] args)
{
List<String> ll = new ArrayList();

List<String> l = new ArrayList();
ll.add("1");
ll.add("2");
ll.add("3");
ll.add("4");
ll.add("5");
ll.add("6");
for (String value : ll)
{
if ("3".equals(value))
{
l.add(value);
}
}
ll.removeAll(l);
System.out.println(ll);
}
}

二.使用迭代器的remove()方法

public class Test
{
public static void main(String[] args)
{
List<String> ll = new ArrayList();
ll.add("1");
ll.add("2");
ll.add("3");
ll.add("4");
ll.add("5");
ll.add("6");
Iterator it = ll.iterator();
while(it.hasNext()){
String value = (String)it.next();
if("3".equals(value)){
it.remove();
}
}
System.out.println(ll);
}
}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值