迭代器为我们提供了统一的遍历容器的方式。

1、Iterator源码分析

public Iterator<E> iterator() {return new Itr();
}private class Itr implements Iterator<E> {int cursor;       // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchpublic boolean hasNext() {return cursor != size;}@SuppressWarnings("unchecked")public E next() {int i = cursor;Object[] elementData = ArrayList.this.elementData;cursor = i + 1;return (E) elementData[lastRet = i];}public void remove() {ArrayList.this.remove(lastRet);cursor = lastRet;lastRet = -1;expectedModCount = modCount;}
}
private class ListItr extends Itr implements ListIterator<E> {ListItr(int index) {super();cursor = index;}public boolean hasPrevious() {return cursor != 0;}public int nextIndex() {return cursor;}public int previousIndex() {return cursor - 1;}@SuppressWarnings("unchecked")public E previous() {int i = cursor - 1;Object[] elementData = ArrayList.this.elementData;cursor = i;return (E) elementData[lastRet = i];}public void set(E e) {}public void add(E e) {}
}

2、迭代器遍历List/Set集合

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class TestListItr {  public static void main(String[] args) {ArrayList<String> list = new ArrayList<String>();for (int i = 0; i < 5; i++) {list.add("a" + i);}System.out.println(list);for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {String temp = iterator.next();System.out.print(temp + "t");if(temp.endsWith("3")) {iterator.remove();}}System.out.println();System.out.println(list);
//      for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
//          String temp = iterator.next();
//          System.out.print(temp + "t");
//          if(temp.endsWith("4")) {
//              list.add("a5");//运行时异常ConcurrentModificationException并发修改异常
//          }
//      }//ListIterator是Iterator接口的扩展,用于解决并发修改异常 for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();) {String temp = iterator.next();System.out.print(temp + "t");if(temp.endsWith("4")) {iterator.add("a5");}}System.out.println();System.out.println(list);}
}

运行结果:

注意:

如果遇到遍历容器时,判断删除元素的情况,使用Iterator遍历;如果是判断添加修改元素的情况,使用ListIterator遍历

3、迭代器遍历Map集合

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class TestMapItr {   public static void main(String[] args) {HashMap<String,Integer> map = new HashMap<String, Integer>();map.put("hello", 123);map.put("world", 456);map.put("java", 789);//方式一Set<String> keySet = map.keySet();for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) {String key = iterator.next();System.out.print(key + "=" + map.get(key) + "t");}System.out.println();//方式二  Entry<String, Integer>键值关系的类型Set<Entry<String, Integer>> entrySet = map.entrySet();for (Iterator<Entry<String, Integer>> iterator = entrySet.iterator(); iterator.hasNext();) {Entry<String, Integer> entry = iterator.next();System.out.print(entry.getKey() + "--" + entry.getValue() + "t");}System.out.println();}
}

运行结果:

我们也可以通过map的keySet()、valueSet()获得key和value的集合,从而遍历它们。

尚学堂百战程序员

百战程序员_IT6000集_影响6000万学习IT的中国人【官网】

容器删除元素后迭代器失效_使用迭代器遍历容器元素相关推荐

  1. 定义了浮动元素后margin-bottom失效的解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 虽然IE6慢慢的退出市场了,但是还是有必要了解一些兼容问题,让自己的知识有一个更好的沉淀.margin-bottom的bug是 ...

  2. java 迭代器失效_迭代器失效的几种情况

    关于迭代器失效,,今天做一个总结. 迭代器失效分三种情况考虑,也是三种数据结构考虑,分别为数组型,链表型,树型数据结构. 1.对于序列式容器,比如vector,删除当前的iterator会使后面所有元 ...

  3. mysql删除记录后id不连续_小水玩转Mysql---Mysql跟踪sql记录

    原因:binlog日志仅记录了操作日志,并没有记录是哪个用户操作的. 目的:需要对操作进行审计,记录用户操作(增删改)记录前提:需要先开启mysql的binlog 第一种方法(设置init_conne ...

  4. 滚动后mouseleave失效_滚动直线导轨副用钳制器可靠性试验设计

    直线模组_直线导轨-广东凯特精密机械有限公司​www.htpm.com.cn 滚动直线导轨副用钳制器是一个具有钳制或刹车功能的多用途产品,因此在对钳制器的可靠性进行评估时应对其多方面的参数进行试验研究 ...

  5. 加mp4文件后js失效_记录一波video.js的使用及问题

    最近的项目中需要播放视频,鉴于html5元素的一些坑及不想自己造轮子,于是就找到了web端播放视频使用量最多的插件video.js,video.js是国外开发者开发的,英语本身就不好的我看英文文档简直 ...

  6. 滚动后mouseleave失效_发动机上的三点接触球轴承失效案例

    点击蓝字获取更多精彩信息 轴承的好坏会直接影响到发动机的正常使用,发动机的高压转子前支点采用的是三点接触球轴承,下面中华轴承网(简称:华轴网)分享是有关三点接触球轴承的失效案例. 1.三点接触球轴承失 ...

  7. shrio 登陆后 还是失效_在 iPhone 上取消订阅后,应用或内容会立即失效吗?

    在 iPhone 中,一些应用和服务需要进行订阅,即您需要支付相应的费用以获得应用或服务中内容的访问权限.如果您想要取消订阅某个项目,可以按以下步骤操作: 前往 iPhone "设置&quo ...

  8. 滚动后mouseleave失效_大型调心滚子轴承偏载失效案例详情

    点击上方蓝字关注我们! 这里的调心滚子轴承是使用在某风力发电机上的主轴轴承,据了解,该大型调心滚子轴承在使用过程中承受了较大的轴向载荷,从而导致调心滚子轴承偏载,整套轴承无法进行调心,造成轴滚道表面剥 ...

  9. 应用长时间置于后台后广播失效_无奈!终于知道为什么关闭了后台应用手机还是卡了!...

    大家都知道,手机的运行空间是有限的,当手机后台同时运行着很多应用手机就会变得卡慢,这时候很多人都会统一将后台应用都关闭掉,但是往往发现,不一会儿手机又卡顿了. 感觉关闭后台应用已经没什么效果了,你知道 ...

最新文章

  1. HDU 5729 Rigid Frameworks(连通性DP)
  2. 论坛报名 | AI赋能未来交通
  3. js老生常谈之this,constructor ,prototype
  4. 【直播提醒】荷小鱼:K12 在线教育应用的开发实践
  5. mysql 复制 二进制文件命令_Mysql中复制详细解析
  6. Ferguson游戏
  7. [转载] java语言程序设计-基础篇
  8. Vs中新建 网站 和Web应用程序的区别
  9. rocketmq 4.X 扩容思路
  10. 如何给页面加上loding_excel打印区域页面设置
  11. docker 获取镜像
  12. c#泛型的使用性能测试
  13. arcore 示例_Android增强现实– Android ARCore示例
  14. 20个编写现代 CSS 代码的建议
  15. java获取weblogic路径_weblogic下java web项目获取根路径
  16. kube-scheduler源码分析(三)之 scheduleOne
  17. 谁是 GameFi 3 月最大的赢家| March Monthly Report
  18. HTML5定稿,为什么是原生App的颠覆
  19. java毕业设计springboot框架 java二手交易网站系统毕业设计开题报告功能参考
  20. lammps案例:Fe原子辐照轰击多层石墨烯模拟

热门文章

  1. Nature:给博士研究生的四条箴言Four golden lessons,颜宁推荐
  2. Cell:新方法PopCOGenT鉴定微生物基因组间的基因流动
  3. pandas使用sort_index函数按照索引排序对dataframe的数据行进行排序(sort dataframe rows by index)
  4. pandas使用fillna函数并设置bfill参数使用列中的后序值填充缺失值
  5. R语言ggplot2可视化绘制Marimekko/Mosaic图实战:自定义函数绘制Marimekko/Mosaic图(添加数值、标题、色彩配置)、ggmosaic包绘制Marimekko图
  6. 机器学习特征工程之特征缩放+无量纲化:最大绝对值缩放(MaxAbsScaler)
  7. 随机森林(Random Forest)为什么是森林?到底随机在哪里?行采样和列采样又是什么东西?
  8. Computational methods for analysis of single molecule sequencing data
  9. 计算机技术的演进过程
  10. Corrigendum: A window into third generation sequencing