迭代器方法、异常处理与并发修改异常,三者之间有何内在联系与区别?

2026-04-12 04:181阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1268个文字,预计阅读时间需要6分钟。

迭代器方法、异常处理与并发修改异常,三者之间有何内在联系与区别?

(目录)一、什么是迭代器?* JDK中提供了一个Iterator接口,称为迭代器,可以实现单列集合元素的遍历* Collection接口中提供了iterator()方法,可以获得迭代器对象* 只能是单列集合使用

(目录)


一、什么是迭代器?

* JDK中提供了一个"Iterator接口",称为迭代器,可以"实现单列集合元素的遍历" * Collection接口中提供了iterator()方法,可以获取迭代器对象 //只能是单列集合使用,Map里面的双列集合是不可以的


二、迭代器的方法

* public boolean hasNext() : 判断是否存在下一个元素 * public E next() : 获取下一个元素 (next()方法"获取元素",并且"指针移动"到下一个位置) * public void remove() : 删除元素 ------------------------------------------------------------------------------------------------------------ // 迭代器使用步骤 : (所有的单列集合都可以使用,因为迭代器是在Collection基础下的) 1. 获取迭代器的对象 集合.iterator(); 2. 循环中,判断是否有元素可以获取 hasNext(); 3. 进入循环,调用next去获取元素 next();


代码演示:

HashSet<String> set=new HashSet<>(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("张三"); //获取迭代器的对象 Iterator<String> itr = set.iterator(); //hasNext():判断集合是否存在下一个元素,有返回true while (itr.hasNext()){ String name = itr.next(); //获取集合的对象 System.out.println(name); }

迭代器方法、异常处理与并发修改异常,三者之间有何内在联系与区别?


三、使用迭代器常见的异常

1、NoSuchElementException异常1

HashSet<String> set=new HashSet<>(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("张三"); //获取迭代器的对象 Iterator<String> itr = set.iterator(); //获取集合的对象 System.out.println(itr.next()); System.out.println(itr.next()); System.out.println(itr.next()); System.out.println(itr.next()); //NoSuchElementException ,如果超过集合的长度取的话就会报没有这个数据的异常 //解决办法: 使用hasNext()判断取元素


2、NoSuchElementException异常2

HashSet<String> set = new HashSet<>(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("张三"); //获取迭代器的对象 Iterator<String> itr = set.iterator(); //hasNext():判断集合是否存在下一个元素,有返回true while (itr.hasNext()) { //不要在一次循环中,多次调用next方法 //这里代表的是一次循环获取两个数据,如果是偶数的话就没有问题,如果是奇数的话就会报异常,获取不到,不建议 System.out.println(itr.next()); System.out.println(itr.next()); }


3、NoSuchElementException异常3

HashSet<String> set = new HashSet<>(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("张三"); //获取迭代器的对象 Iterator<String> itr = set.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } // 使用迭代器时候,数据不能重复使用 System.out.println(itr.next()); //NoSuchElementException ,因为这个迭代器里面的数据已经用完了, //不能再使用这个迭代器获取数据,想使用的话要用新的迭代器 ----------------------------------------------------------------------------------------------------------- //解决办法 : 再次获取一个新的迭代器 Iterator<String> itr2 = set.iterator(); while (itr2.hasNext()){ String next = itr2.next(); System.out.println(next); }



4、无限循环

Iterator<String> itr2 = set.iterator(); while (itr2.hasNext()){ String next = itr2.next(); System.out.println(next); } //一直问有没有数据,不做操作会进入死循环 while(itr2.hasNext()){ }


四、并发修改异常

1、产生原因

当使用迭代器或者增强for循环遍历集合时, 在迭代过程中调用集合类自身的remove或者add等方法改变集合的元素个数时, 就会产生"ConcurrentModificationException",即"并发修改异常" "(两个对象同时在执行操作,造成冲突)"


ArrayList<Integer> list=new ArrayList<>(); list.add(11); list.add(22); list.add(33); list.add(44); list.add(55); Iterator<Integer> it1 = list.iterator(); // 迭代器在遍历集合,集合对象在删除数据,造成对数据处理的冲突 while (it1.hasNext()){ Integer number = it1.next(); if(number%2==0){ list.remove(number); } } System.out.println(list); //ConcurrentModificationException : 并发修改异常 // 两个对象同时在执行操作,造成冲突


2、解决办法

1.使用普通for循环遍历元素,在循环中"使用集合自带的add或remove方法增删元素即可" 2.如果使用迭代器遍历集合,在迭代过程中如果需要删除元素,可以"使用迭代器自带的remove方法"


ArrayList<Integer> list=new ArrayList<>(); list.add(11); list.add(22); list.add(33); list.add(44); list.add(55); Iterator<Integer> it1 = list.iterator(); //解决办法:统一成一个对象就行 while (it1.hasNext()){ Integer number = it1.next(); if(number%2==0){ it1.remove(); } } //也可以集合自己遍历删 for (int i = 0; i < list.size(); i++) { Integer number = list.get(i); if(number%2==0){ list.remove(number); i--; } } } }



作者:KJ.JK

标签:方法使用

本文共计1268个文字,预计阅读时间需要6分钟。

迭代器方法、异常处理与并发修改异常,三者之间有何内在联系与区别?

(目录)一、什么是迭代器?* JDK中提供了一个Iterator接口,称为迭代器,可以实现单列集合元素的遍历* Collection接口中提供了iterator()方法,可以获得迭代器对象* 只能是单列集合使用

(目录)


一、什么是迭代器?

* JDK中提供了一个"Iterator接口",称为迭代器,可以"实现单列集合元素的遍历" * Collection接口中提供了iterator()方法,可以获取迭代器对象 //只能是单列集合使用,Map里面的双列集合是不可以的


二、迭代器的方法

* public boolean hasNext() : 判断是否存在下一个元素 * public E next() : 获取下一个元素 (next()方法"获取元素",并且"指针移动"到下一个位置) * public void remove() : 删除元素 ------------------------------------------------------------------------------------------------------------ // 迭代器使用步骤 : (所有的单列集合都可以使用,因为迭代器是在Collection基础下的) 1. 获取迭代器的对象 集合.iterator(); 2. 循环中,判断是否有元素可以获取 hasNext(); 3. 进入循环,调用next去获取元素 next();


代码演示:

HashSet<String> set=new HashSet<>(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("张三"); //获取迭代器的对象 Iterator<String> itr = set.iterator(); //hasNext():判断集合是否存在下一个元素,有返回true while (itr.hasNext()){ String name = itr.next(); //获取集合的对象 System.out.println(name); }

迭代器方法、异常处理与并发修改异常,三者之间有何内在联系与区别?


三、使用迭代器常见的异常

1、NoSuchElementException异常1

HashSet<String> set=new HashSet<>(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("张三"); //获取迭代器的对象 Iterator<String> itr = set.iterator(); //获取集合的对象 System.out.println(itr.next()); System.out.println(itr.next()); System.out.println(itr.next()); System.out.println(itr.next()); //NoSuchElementException ,如果超过集合的长度取的话就会报没有这个数据的异常 //解决办法: 使用hasNext()判断取元素


2、NoSuchElementException异常2

HashSet<String> set = new HashSet<>(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("张三"); //获取迭代器的对象 Iterator<String> itr = set.iterator(); //hasNext():判断集合是否存在下一个元素,有返回true while (itr.hasNext()) { //不要在一次循环中,多次调用next方法 //这里代表的是一次循环获取两个数据,如果是偶数的话就没有问题,如果是奇数的话就会报异常,获取不到,不建议 System.out.println(itr.next()); System.out.println(itr.next()); }


3、NoSuchElementException异常3

HashSet<String> set = new HashSet<>(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("张三"); //获取迭代器的对象 Iterator<String> itr = set.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } // 使用迭代器时候,数据不能重复使用 System.out.println(itr.next()); //NoSuchElementException ,因为这个迭代器里面的数据已经用完了, //不能再使用这个迭代器获取数据,想使用的话要用新的迭代器 ----------------------------------------------------------------------------------------------------------- //解决办法 : 再次获取一个新的迭代器 Iterator<String> itr2 = set.iterator(); while (itr2.hasNext()){ String next = itr2.next(); System.out.println(next); }



4、无限循环

Iterator<String> itr2 = set.iterator(); while (itr2.hasNext()){ String next = itr2.next(); System.out.println(next); } //一直问有没有数据,不做操作会进入死循环 while(itr2.hasNext()){ }


四、并发修改异常

1、产生原因

当使用迭代器或者增强for循环遍历集合时, 在迭代过程中调用集合类自身的remove或者add等方法改变集合的元素个数时, 就会产生"ConcurrentModificationException",即"并发修改异常" "(两个对象同时在执行操作,造成冲突)"


ArrayList<Integer> list=new ArrayList<>(); list.add(11); list.add(22); list.add(33); list.add(44); list.add(55); Iterator<Integer> it1 = list.iterator(); // 迭代器在遍历集合,集合对象在删除数据,造成对数据处理的冲突 while (it1.hasNext()){ Integer number = it1.next(); if(number%2==0){ list.remove(number); } } System.out.println(list); //ConcurrentModificationException : 并发修改异常 // 两个对象同时在执行操作,造成冲突


2、解决办法

1.使用普通for循环遍历元素,在循环中"使用集合自带的add或remove方法增删元素即可" 2.如果使用迭代器遍历集合,在迭代过程中如果需要删除元素,可以"使用迭代器自带的remove方法"


ArrayList<Integer> list=new ArrayList<>(); list.add(11); list.add(22); list.add(33); list.add(44); list.add(55); Iterator<Integer> it1 = list.iterator(); //解决办法:统一成一个对象就行 while (it1.hasNext()){ Integer number = it1.next(); if(number%2==0){ it1.remove(); } } //也可以集合自己遍历删 for (int i = 0; i < list.size(); i++) { Integer number = list.get(i); if(number%2==0){ list.remove(number); i--; } } } }



作者:KJ.JK

标签:方法使用