Iterator 怎么使用?有什么特点?

看一下 Iterator 接口源码中的方法

//是否有下一个元素
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());
}

使用

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);}});}
}

打印结果

111
222
333111
222
333111
333

注意事项

  • 在迭代过程中调用集合的 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();}}});}

参考:

AbstractList 迭代器实现分析


【Java面试题与答案】整理推荐

  • 基础与语法
  • 集合
  • 网络编程
  • 并发编程
  • Web
  • 安全
  • 设计模式
  • 框架
  • 算法与数据结构
  • 异常
  • 文件解析与生成
  • Linux
  • MySQL
  • Oracle
  • Redis
  • Dubbo

Iterator 怎么使用?有什么特点?相关推荐

  1. 184_刘发顺_Java核心编程

    Java核心编程 Java 技术栈: Java基础 Java面向对象:Java 是一种面向对象的语言,它对对象中的类.对象.继承.封装.多态.接口.包等均有很好的支持.为了简单起见,Java 只支持类 ...

  2. 2021年大数据常用语言Scala(十九):基础语法学习 iterator迭代器

    目录 iterator迭代器 使用迭代器遍历集合 iterator迭代器 scala针对每一类集合都提供了一个迭代器(iterator)用来迭代访问集合 使用迭代器遍历集合 使用iterator方法可 ...

  3. Java Iterator 使用

    学而时习之,温故而知新. 迭代器是一种模式.详细可见其设计模式,可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的.只要拿到这个对象,使用迭代器就可以遍 ...

  4. Java技术——Iterator和Enumeration的不同

    0. Iterator和Enumeration的不同 (1)两者的函数接口不同 Enumeration只有2个函数接口,通过Enumeration我们只能读取集合的数据,而不能对数据进行修改. Ite ...

  5. Rocksdb iterator 的 Forward-scan 和 Reverse-scan 的性能差异

    前言 最近在读 MyRocks 存储引擎2020年的论文,因为这个存储引擎是在Rocksdb之上进行封装的,并且作为Facebook 内部MySQL的底层引擎,用来解决Innodb的空间利用率低下 和 ...

  6. Rocksdb Iterator实现:从DBIter 到 TwoLevelIter 的漫长链路

    文章目录 1. 迭代器简单介绍 2. 迭代器用户态相关接口 3. 迭代器内部架构 4. 迭代器的入口实现 4.1 DBIter 4.2 MergingIterator 4.3 Memtable系列It ...

  7. Rocksdb iterator和snapshot 接口

    Rocksdb提供迭代器来来访问整个db中的数据,就像STL中的迭代器功能一样,用来访问容器中的具体的数据. 访问形式以及访问接口有如下几种: 遍历所有的key-value //打开db,并初始化一个 ...

  8. STL模拟实现1.0 -- list和iterator模拟实现和简单分析

    引言 C ++ 标准模本库<STL>中有很多优秀的代码实现,不然怎么能叫做C++标准模板库呢,其中一个实现就是有一个容器,叫做list.所谓容器其实就是存储相同类型数据的一个存储集合,li ...

  9. ArrayList Iterator remove java.lang.UnsupportedOperationException

    在使用Arrays.asList()后调用add,remove这些method时出现 java.lang.UnsupportedOperationException异常.这是由于Arrays.asLi ...

  10. C++/C++11中头文件iterator的使用

    <iterator>是C++标准程序库中的一个头文件,定义了C++ STL标准中的一些迭代器模板类,这些类都是以std::iterator为基类派生出来的.迭代器提供对集合(容器)元素的操 ...

最新文章

  1. Web开发(一)·期末不挂之第四章·CSS语法基础(CSS选择器选择器优先级各类样式表的使用方法)
  2. Cheese 模拟,贪心(300)
  3. Angularjs Controller 间通信机制
  4. android开发之图表
  5. 【竞赛方案】2020腾讯广告算法大赛:高分进阶
  6. boost::hana::duplicate用法的测试程序
  7. php判断字符串中是否包含某字符串
  8. Arcgis10安装说明
  9. 【转】sharepoint foundation 2013升级sp1补丁后无法使用搜索功能
  10. python顺序结构代码_Python代码结构——顺序、分支、循环
  11. jenkins java版本_安装jenkins几个版本貌似都有问题
  12. 4、Firefox 中安装Fiddler插件
  13. Unity手游开发与实战
  14. DropDownList 实现分页不包含选择值
  15. 124 并发编程小结
  16. 动手写简单的音乐推荐系统
  17. JavaScript学习指南 (来自转载)
  18. CANAPE字体颜色c语言,CANape介绍.doc
  19. Qt游戏编程——飞机大战
  20. 怎么拆分PDF文档?一分钟学会拆分PDF文档的方法

热门文章

  1. Supervisely 人像分割数据集
  2. SpringBoot+Dubbo整合
  3. 二维彩虹产品功能更新(H5编辑二维码)
  4. 买天文望远镜必看——已知望远镜焦距、相机画幅,求视场(附代码,实时更新)
  5. 考研政治——马克思辩证法中的两大特征和五大范畴
  6. 一个cv大师的摆烂之旅
  7. C51单片机-2只LED灯循环闪烁
  8. 3月12日 植树节 Arbor Day / Planting Trees Day
  9. 怎么修改手机app服务器数据库,手机app服务器数据库
  10. ChatGPT账号没封的看过来,与ChatGPT玩个超级创意游戏