我是靠谱客的博主 傻傻狗,这篇文章主要介绍Iterator使用及ArrayList遍历注意事项,现在分享给大家,希望可以做个参考。

Iterator使用及ArrayList遍历注意事项

(一)Iterator

  • Iterator接口是java集合框架成员,Iterator主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。
  • Iterator接口隐藏了各种Collection实现类的底层细节,功能比较简单,并且只能单向移动。

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

(二)ArrayList遍历注意事项

  • 【切记】Iterator对象的remove方法是迭代过程中删除元素的唯一方法
  • 下面我们来看ArrayList遍历中的陷阱:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.ArrayList; public class ArrayListRemove { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("b"); list.add("c"); list.add("c"); list.add("c"); remove(list); for (String s : list) { System.out.println("element : " + s); } } public static void remove(ArrayList<String> list) { // TODO: }

如果要想删除list的b字符,有下面两种常见的错误例子:

  • 错误写法实例一
复制代码
1
2
3
4
5
6
7
8
9
10
11
public static void remove(ArrayList<String> list) { for (int i = 0; i < list.size(); i++) { String s = list.get(i); if (s.equals("b")) { list.remove(s); } } }
  • 错误的原因:这种最普通的循环写法执行后会发现第二个“b”的字符串没有删掉。

  • 错误写法实例二:

复制代码
1
2
3
4
5
6
7
8
9
10
public static void remove(ArrayList<String> list) { for (String s : list) { if (s.equals("b")) { list.remove(s); } } }
  • 错误的原因:这种for-each写法会报出著名的并发修改异常:java.util.ConcurrentModificationException。

    -先解释一下实例一的错误原因:针对错误写法一,在遍历第一个字符串b时因为符合删除条件,所以将该元素从数组中删除,并且将后一个元素移动(也就是第二个字符串b)至当前位置,导致下一次循环遍历时后一个字符串b并没有遍历到,所以无法删除。针对这种情况可以倒序删除的方式来避免:

复制代码
1
2
3
4
5
6
7
8
9
10
11
public static void remove(ArrayList<String> list) { for (int i = list.size() - 1; i >= 0; i--) { String s = list.get(i); if (s.equals("b")) { list.remove(s); } } }
  • 因为数组倒序遍历时即使发生元素删除也不影响后序元素遍历。

  • 对于第二种的解释是:在对Collection类进行迭代时,要调用删除元素时必须调用Iterator的remove()方法,而不能调用Collection的remove()方法。所以正确的迭代方法是下面的代码所示:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void remove(ArrayList<String> list) { Iterator it = list.iterator(); while(it.hasNext()){ String s = it.next(); if( s.equals("b")){ it.remove(); } } }

最后

以上就是傻傻狗最近收集整理的关于Iterator使用及ArrayList遍历注意事项的全部内容,更多相关Iterator使用及ArrayList遍历注意事项内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部