当前位置: 首页 > news >正文

iterator取集合元素

1,完整代码

//创建两个arraylist对象
        Collection al = new ArrayList();
        
        //al1添加元素
        al.add("name1");
        al.add("name4");
        al.add("name3");
        
        Iterator it=al.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }

for循环的实现

 

for(Iterator it=al.iterator();it.hasNext();)
        {
            System.out.println(it.next());
        }

 

for()的好处:更节约内存

Iterator定义在了循环内部,在循环结束后,it就被释放了,

而在While中it定义在了循环外面,循环结束后对象依然存在,但是却没什么用处,就造成了内存的浪费

 

2,什么是迭代器?

其实就是集合的取出方式。

【通俗的讲:取一个在就判断一下集合中还有没有元素,有就取出,没有就结束】

3,迭代器(Iterator)的方法?

next();

hasNext();

remove();

4,关键代码

Iterator it=al.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }

5,迭代器与集合的关系?

迭代器用于取出集合中的元素,各种集合的底层数据结构并不相同,所以存取方式是不同的,每个集合都具备取出的操作,但是集合的取出比较复杂,不止一个动作,就将取出这个动作封装成了一个对象

定义在内部的原因:

迭代器操作的是集合内部的元素,定义在类的内部更加方便

如果创建在外部,还需要创建集合对象

6,iterator实现源代码【为了防变代码的观看,我把代码反复到了自定义的.java文件中,导致的报错(忽略就好)】

Iterator方法的最初定义是在AbstractList这个类中,他的方法实现很简单就是return了一个Itr对象,

Itr是什么呢?

在上图中可以看到,它是定义在AbstractList这个类里面的内部类

在他的内部定义了我们经常使用的hasNext(),Next(),remove()

然后在Iterator()里面返回了Itr对象

7,下面是Itr的具体实现源码 

 private class Itr implements Iterator<E>
    {
    
        int cursor = 0;    
        int lastRet = -1;
        int expectedModCount = modCount;
    
        public boolean hasNext()
        {
            return cursor != size();
        }

        public E next() 
        {
            checkForComodification();
            try 
            {
                E next = get(cursor);
                lastRet = cursor++;
                return next;
            } 
            catch (IndexOutOfBoundsException e)
            {
                checkForComodification();
                throw new NoSuchElementException();
            }
        }
    
        public void remove() {
            if (lastRet == -1)
            throw new IllegalStateException();
                checkForComodification();
    
            try {
            AbstractList.this.remove(lastRet);
            if (lastRet < cursor)
                cursor--;
            lastRet = -1;
            expectedModCount = modCount;
            } catch (IndexOutOfBoundsException e) {
            throw new ConcurrentModificationException();
            }
        }
    
        final void checkForComodification() 
        {
            if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
        }
    }

 

转载于:https://www.cnblogs.com/excellencesy/p/8626551.html

相关文章:

  • 前端ps切图,图文教程,详细。
  • android6.0以上权限动态申请,有视频链接可以看效果。
  • svm资料收集
  • java学习--基础知识第四天--笔记
  • WPF中自定义MarkupExtension
  • 省选专练CQOI2015网络吞吐量
  • 博客作业2---线性表
  • spring-boot jpa mysql emoji utfmb4 异常处理
  • list.FindAll of C#
  • 关于emgucv控制多摄像头问题
  • 一分钟上手, 让 Golang 操作数据库成为一种享受
  • 逆序对问题
  • 14.boost最小生成树 kruskal_min_spainning_tree
  • CAP原则(CAP定理)、BASE理论
  • Google I/O 2014 大会总结 Android开发新方向
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • angular2开源库收集
  • Go 语言编译器的 //go: 详解
  • java 多线程基础, 我觉得还是有必要看看的
  • JAVA 学习IO流
  • JS数组方法汇总
  • Linux CTF 逆向入门
  • PAT A1050
  • Python 反序列化安全问题(二)
  • sessionStorage和localStorage
  • VuePress 静态网站生成
  • 从0到1:PostCSS 插件开发最佳实践
  • 计算机在识别图像时“看到”了什么?
  • 聊聊hikari连接池的leakDetectionThreshold
  • 排序(1):冒泡排序
  • 前端攻城师
  • 如何利用MongoDB打造TOP榜小程序
  • 三栏布局总结
  • 项目实战-Api的解决方案
  • 译自由幺半群
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (HAL库版)freeRTOS移植STMF103
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)汇编语言——简单程序
  • (转) ns2/nam与nam实现相关的文件
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .cfg\.dat\.mak(持续补充)
  • .net Signalr 使用笔记
  • .net中调用windows performance记录性能信息
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...