参考答案
1. Iterator的定义
前往查看:迭代器Iterator是什么
2. Iterator接口源码中的方法
- java.lang.Iterable接口被java.util.Collection接口继承,java.util.Collection 接口的iterator()方法返回一个Iterator对象;
- next()方法获得集合中的下一个元素;
- hasNext()检查集合中是否还有元素;
- remove()方法将迭代器新返回的元素删除;
- forEachRemaining(Consumer<? super E> action)方法,遍历所有元素。
3. JDK 1.8 源码如下:
//是否有下一个元素 boolean hasNext(); //下一个元素 E next(); //从迭代器指向的集合中删除迭代器返回的最后一个元素 default void remove() { throw new UnsupportedOperationException("remove"); } //遍历所有元素 default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); }
4. Iterator使用实例
public class TestIterator { static List<String> list = new ArrayList<String>(); static { list.add("111"); list.add("222"); list.add("333"); } public static void main(String[] args) { testIteratorNext(); System.out.println(); testForEachRemaining(); System.out.println(); testIteratorRemove(); } //使用 hasNext 和 next遍历 public static void testIteratorNext() { Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String str = iterator.next(); System.out.println(str); } } //使用 Iterator 删除元素 public static void testIteratorRemove() { Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String str = iterator.next(); if ("222".equals(str)) { iterator.remove(); } } System.out.println(list); } //使用 forEachRemaining 遍历 public static void testForEachRemaining() { final Iterator<String> iterator = list.iterator(); iterator.forEachRemaining(new Consumer<String>() { public void accept(String t) { System.out.println(t); } }); } }
5. 注意事项
- 在迭代过程中调用集合的remove(Object o)可能会报 java.util.ConcurrentModificationException异常;
- forEachRemaining方法中调用Iterator 的 remove 方法会报 java.lang.IllegalStateException异常.
//使用迭代器遍历元素过程中,调用集合的 remove(Object obj) 方法可能会报 java.util.ConcurrentModificationException 异常 public static void testListRevome() { ArrayList<String> aList = new ArrayList<String>(); aList.add("111"); aList.add("333"); aList.add("222"); System.out.println("移除前:"+aList); Iterator<String> iterator = aList.iterator(); while(iterator.hasNext()) { if("222".equals(iterator.next())) { aList.remove("222"); } } System.out.println("移除后:"+aList); } //JDK 1.8 Iterator forEachRemaining 方法中 调用Iterator 的 remove 方法会报 java.lang.IllegalStateException 异常 public static void testForEachRemainingIteRemove () { final Iterator<String> iterator = list.iterator(); iterator.forEachRemaining(new Consumer<String>() { public void accept(String t) { if ("222".equals(t)) { iterator.remove(); } } }); }
以上,是Java面试题【Iterator怎么用,特点是什么】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—