对集合的删除为什么要使用迭代器

小鱼儿 2024-04-18 14:37 113阅读 0赞

先看看如果不使用迭代器的情况:

1.增强for循环中使用remove删除

  1. ArrayList<String> list = new ArrayList<String>();
  2. list.add("1");
  3. list.add("2");
  4. list.add("3");
  5. list.add("4");
  6. list.add("5");
  7. for(String s:list){
  8. if(s.equals("5")){
  9. list.remove(s);
  10. }
  11. }
  12. System.out.println(list);

结果:
Exception in thread “main” java.util.ConcurrentModificationException

modCount是指这个list对象从new出来到现在被修改次数,当调用List的add或者remove方法的时候,这个modCount都会自动增减;

expectedModCount是指Iterator现在期望这个list被修改的次数是多少次。
在iterator的next方法中会判断modCount和expectedModCount是否相等不相等就抛异常

  1. .` public static void main(String[] args) {

    1. List<String>list=new ArrayList<>();
    2. list.add("a");
    3. list.add("b");
    4. list.add("d");
    5. list.add("d");
    6. list.add("d");
    7. list.add("d");
    8. list.add("d");
    9. list.add("d");
    10. list.add("f");
    11. for (int i=0;i<list.size();i++){
    12. if(list.get(i).equals("d")){
    13. list.remove(i);
    14. }
    15. }
  1. for (int j=0;j<list.size();j++){
  2. System.out.println(list.get(j)+"***");
  3. }
  4. }

结果:
a***
b***
d***
d***
d***
f***

结论:
这种方法虽然不会抛异常但是相同两个要删除的元素连续出现只能删除一个,会出现漏掉要删除的元素;

正确方式:Iterator迭代器

  1. Iterator<String> iterator=list.iterator();
  2. while(iterator.hasNext())
  3. {
  4. if(iterator.next().equals("d")){
  5. iterator.remove();
  6. }
  7. }

1、当创建完成指向某个集合或者容器的Iterator对象是,这是的指针其实指向的是第一个元素的上方,即指向一个 空
2、当调用hasNext方法的时候,只是判断下一个元素的有无,并不移动指针
3、当调用next方法的时候,向下移动指针,并且返回指针指向的元素,如果指针指向的内存中没有元素,会报异 常。
4、remove方法删除的元素是指针指向的元素。如果当前指针指向的内存中没有元素,那么会抛出异常。

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读

    相关 集合框架——Iterator

    Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续判断,如果还有就再取出来。一直把集合中的元素全部取出。这种取出

    相关 集合

      遍历集合有两种方式:   1.toArray(),可以把集合转换成数组,然后遍历数组。   2.iterator(),可以返回一个迭代器对象,我们可以通过迭代器对象来遍

    相关 Java集合

    迭代器 概念 迭代器是一种设计模式,提供了一种方法,来对容器、集合进行遍历的方式, 不需要关注底层数据结构和数据类型,来达到底层和上层遍历解耦的目的