java学习3:集合遍历增删报错,at java.util.HashMap$KeyIterator.next

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ggwxk1990/article/details/77688195
今天学习集合遇到一个报错,经过排查发现集合遍历的时候和长度有关,集合如果一边遍历一边增删,会导致长


度size变化,规则发生变化,会报错。
此处mark一下:


报错如下:

Exception in thread “main” java.util.Concurat java.util.HashMap$HashIterator.nextEntry

(HashMap.java:894)rentModificationExcepti

at java.util.HashMap$KeyIterator.next(HashMap.java:928)on

at com.imooc.set.CatTest.main(CatTest.java:77)


原程序如下:
前面序列省略。。。。

for (Cat cat : set) {
     if (“花花”.equals(cat.getName())) {
       set.remove(cat);
     }
}
在单步调试中,此处cat.getName()已经获得“花花”,执行到set.remove(cat)时,是成功的,set.size 由原来3变为了2,但是再执行下一步时,直接报错,程序中断。

注意:这里的集合是无序的,但是在使用的时候,如果remove的对象是最后一个,那么不会报错,如果是前面的,就会涉及size变化,导致报错。


以下为两种解决办法:
方案1:
由于此处是set集合,所以每个元素均为唯一,如果匹配出的数据为1个的话,直接在set.remove()后加break跳出


即可。
for (Cat cat : set) {
     if (“花花”.equals(cat.getName())) {
       set.remove(cat);
       break;
     }
}
方案二:
如果匹配出的数据不唯一,有很多条,那么上面的方法就不可行了。
解决办法:采用removeAll 方法,用大集合减去小集合的方式得到结果。

将匹配得到的cat对象,先存入set1中,再用set集合减去set1集合即可

Set<Cat> set1=new HashSet<Cat>();
for (Cat cat : set) {
      if (cat.getMonth()<5) {
          set1.add(cat);
          }
}
set.removeAll(set1);


方案三:
这种方案比较上两种更容易理解。
思路:用while和迭代器遍历。但是这里删除的时候是调用集合的remove方法,不带参数,此处应该是不会涉及到size问题。此时,就可以删除,而且遍历成功。
it = set.iterator();
while (it.hasNext()) {
  Cat d = it.next();
  if (“花花”.equals(d.getName())) {
        it.remove();
      }
}

最后,在三种方法修改后,可以打印出结果,这里用for()循环即可,简单好用。
for (Cat cat : set) {
    System.out.println(cat);
}
            </div>

转自:https://blog.csdn.net/ggwxk1990/article/details/77688195

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ggwxk1990/article/details/77688195
今天学习集合遇到一个报错,经过排查发现集合遍历的时候和长度有关,集合如果一边遍历一边增删,会导致长


度size变化,规则发生变化,会报错。
此处mark一下:


报错如下:

Exception in thread “main” java.util.Concurat java.util.HashMap$HashIterator.nextEntry

(HashMap.java:894)rentModificationExcepti

at java.util.HashMap$KeyIterator.next(HashMap.java:928)on

at com.imooc.set.CatTest.main(CatTest.java:77)


原程序如下:
前面序列省略。。。。

for (Cat cat : set) {
     if (“花花”.equals(cat.getName())) {
       set.remove(cat);
     }
}
在单步调试中,此处cat.getName()已经获得“花花”,执行到set.remove(cat)时,是成功的,set.size 由原来3变为了2,但是再执行下一步时,直接报错,程序中断。

注意:这里的集合是无序的,但是在使用的时候,如果remove的对象是最后一个,那么不会报错,如果是前面的,就会涉及size变化,导致报错。


以下为两种解决办法:
方案1:
由于此处是set集合,所以每个元素均为唯一,如果匹配出的数据为1个的话,直接在set.remove()后加break跳出


即可。
for (Cat cat : set) {
     if (“花花”.equals(cat.getName())) {
       set.remove(cat);
       break;
     }
}
方案二:
如果匹配出的数据不唯一,有很多条,那么上面的方法就不可行了。
解决办法:采用removeAll 方法,用大集合减去小集合的方式得到结果。

将匹配得到的cat对象,先存入set1中,再用set集合减去set1集合即可

Set<Cat> set1=new HashSet<Cat>();
for (Cat cat : set) {
      if (cat.getMonth()<5) {
          set1.add(cat);
          }
}
set.removeAll(set1);


方案三:
这种方案比较上两种更容易理解。
思路:用while和迭代器遍历。但是这里删除的时候是调用集合的remove方法,不带参数,此处应该是不会涉及到size问题。此时,就可以删除,而且遍历成功。
it = set.iterator();
while (it.hasNext()) {
  Cat d = it.next();
  if (“花花”.equals(d.getName())) {
        it.remove();
      }
}

最后,在三种方法修改后,可以打印出结果,这里用for()循环即可,简单好用。
for (Cat cat : set) {
    System.out.println(cat);
}
            </div>

转自:https://blog.csdn.net/ggwxk1990/article/details/77688195

猜你喜欢

转载自blog.csdn.net/u013651026/article/details/82107852