一、Iterator概述
Iterator是Java中内置的一种迭代器,主要用于遍历和操作集合中的元素。使用Iterator可以在遍历集合时移除集合中的元素而不会出现ConcurrentModificationException异常。
Java中所有的集合类都实现了Iterable接口,其接口中声明了一个iterator方法,返回一个Iterator对象。通过调用Iterator对象的next()方法可以获取集合的下一个元素,调用hasNext()方法可以检查集合是否还有元素可以遍历,调用remove()方法可以在遍历集合的同时,移除集合中的元素。
二、Iterator和For-each循环的对比
在遍历集合时,通常使用Iterator或For-each循环。Iterator可以在遍历时任意移除元素,而For-each循环则不支持集合的修改操作。
例如,我们有一个List集合list,其中存放了整型元素。我们想要移除所有小于5的元素。
List<Integer> list = new ArrayList<>(); list.add(1); list.add(3); list.add(5); list.add(2); list.add(4); list.add(6); // 使用Iterator移除小于5的元素 Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer item = iterator.next(); if (item < 5) { iterator.remove(); // 可以在遍历时移除元素 } } // 使用For-each循环不能移除元素 for (Integer item : list) { if (item < 5) { list.remove(item); // For-each循环不支持修改操作,会抛出ConcurrentModificationException异常 } }
三、Iterator与多线程
Iterator本身不是线程安全的,因此在使用时需要注意。如果在遍历集合时,在其他线程中修改了集合,会抛出ConcurrentModificationException异常。
例如下面的代码,在两个线程中分别遍历集合list,并尝试修改元素,会抛出ConcurrentModificationException异常。
List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); new Thread(() -> { Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); list.add(6); // 在其他线程中修改集合 } }).start(); new Thread(() -> { list.remove(3); // 在其他线程中修改集合 }).start();
四、Iterator的优化
在遍历集合时,我们常常需要检索集合元素的值,此时可以使用迭代器中的forEachRemaining方法,遍历集合中剩余未迭代的元素,这样可以避免在每次迭代时都调用一次hasNext方法。
例如下面的代码:
List<String> list = new ArrayList<>(); list.add("hello"); list.add("world"); list.add("java"); Iterator<String> iterator = list.iterator(); String value = null; while (iterator.hasNext()) { value = iterator.next(); System.out.println(value); } // 使用forEachRemaining方法 iterator = list.iterator(); iterator.next(); iterator.forEachRemaining(System.out::println);
五、Iterator的实现原理
Iterator的底层是通过调用集合的迭代器方法返回一个实现了Iterator接口的内部类,该内部类持有集合的引用,可以遍历集合中的元素。在遍历集合时,通过调用集合的遍历方法实现元素的获取和移除。因此,Iterator的实现依赖于集合的具体实现。
例如,在ArrayList中,如果在遍历集合时调用了remove方法,则会通过调用ArrayList的remove方法来实现元素的移除操作。而在LinkedList中,如果在遍历集合时调用了remove方法,则会先将集合转为列表迭代器,再通过列表迭代器的remove方法来实现元素的移除操作。
六、总结
Iterator是Java中常用的遍历集合的工具,可以在遍历集合时安全地修改集合,是集合类的基础功能之一。使用Iterator时需要注意多线程问题,以及一些代码优化技巧,可以提高代码效率。