java it_关于 Java Iterator(迭代器)学习笔记

相信 “迭代” 对于Java程序员来说并不陌生(当然,其他语言的程序员也是如此),在处理数据时,不可避免地会存在对数据的大量遍历操作。对于我自己而言,学习使用Java语言两年时间,对于“迭代”的概念还停留在 for:each,for:i的遍历阶段。今天用到了JDK 提供的迭代接口进行 Java 集合的迭代,便决定作以笔记,留作以后学习。

普通 Java 集合迭代(遍历)

迭代可以简单理解为遍历,在没有 JDK 并未提供迭代器时,我们对于数据的遍历处理如下:

对于数组的遍历处理:

Bean[] beans = new Bean[5];

for (int i = 0; i < beans.length; i++) {

beans[i] = new Bean();

// todo something

}

对 ArrayList 的遍历处理:

ArrayList beanArrayList = new ArrayList();

for (int i = 0; i < beanArrayList.size(); i++) {

beanArrayList.add(new Bean());

// todo something

}

可以看出,如果我们想对一个空的 Java 集合添加数据,那我们就必须知道该集合内部的数据结构(即,以数组和 ArrayList 为例,添加时的操作应该是beans[i] = new Bean();还是beanArrayList.add(new Bean());),这样就导致了访问逻辑与集合的结构本身紧密耦合(即,每一种不同的数据集合对应了不同的便利方法),这会使得代码无法复用。

而 Iterator 可以轻松的解决上述问题.

java.util.Iterator

看一下官方未出的解释:

public interface Iterator

An iterator over a collection. Iteratortakes the place of Enumeration

in the Java Collections Framework. Iterators differ from enumerations in two ways:

Iterators allow the caller to remove elements from the underlying collection during the iteration with well-defined semantics.

Method names have been improved.

This interface is a member of the Java Collections Framework

就是说,Iterator是一个对 collection 集合进行迭代的迭代器(接口)。Iterator迭代器取代了 Java Collections Framework 中的 Enumeration。该接口是 Java Collections Framework 的成员。迭代器与枚举有两点不同:

迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。

方法名称得到了改进。

.

这也就意味着,Iterator 使用相同的访问逻辑完成集合的遍历,使得我们在访问集合元素时,无需关心不同的集合内部结构。从而降低访问逻辑与集合本身的耦合度。

Iterator接口源代码如下:

package java.util;

import java.util.function.Consumer;

public interface 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());

}

}

如何使用 Iterator

在使用中,我们既可以借助hasNext()及next()方法,对已知集合结构的集合对象完成简单的迭代(类似于之前的方案),就像这样:

Iterator beanIterator = beanArrayList.iterator();

while (beanIterator.hasNext()) {

Bean bean = beanIterator.next();

// todo something

}

更新于2017.12.03

仅仅这样不是与之前的方案没什么区别了吗?当然,它能做的还可以更多。做到真正不去关心集合内部结构的迭代手段,下述代码是对一个集合对象的迭代:

public static boolean isExist(Collection beans, Bean bean) {

Iterator iterator = beans.iterator();

System.out.println(beans.getClass().getSimpleName() + ":");

while (iterator.hasNext()) {

if (iterator.next().equals(bean)) {

System.out.println("集合中已存在 Bean[" + bean + "]");

return true;

}

}

return false;

}

Test:

public static final void main(String[] args) {

Bean bean0 = new Bean().setId("01");

Bean bean1 = new Bean().setId("02");

ArrayList beanArrayList = new ArrayList<>();

Queue beanQueue = new LinkedBlockingQueue<>();

HashMap map = new HashMap<>();

beanArrayList.add(bean0);

beanArrayList.add(bean1);

map.put(bean0, bean0);

map.put(bean1, bean1);

beanQueue.add(bean0);

beanQueue.add(bean1);

isExist(map.keySet(), bean0);

isExist(beanArrayList, bean1);

isExist(beanQueue, bean1);

}

输出结果:

KeySet:

集合中已存在 Bean[Bean{id='01', password='null'}]

ArrayList:

集合中已存在 Bean[Bean{id='02', password='null'}]

LinkedBlockingQueue:

集合中已存在 Bean[Bean{id='02', password='null'}]

总结

所有Collection框架中的j几乎所有的集合类(或接口)(如ArrayList、Set、Queue等)都实现了(接口也声明了iterator()方法)自己的内部的迭代器,但无疑都是Iterator的实现。

不过据我现在所了解到的,数组由于其本身的实现方案与 "编译处理和

JVM 的native()方法有关,似乎不能直接获取到其本身的迭代器。如果有哪位朋友知道相关方法,请评论告知,不胜感谢。

这是第一次尝试写学习笔记,希望以后可以坚持下去,事无巨细地,从点滴累积自己的财富。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scss-!optional

optional翻译成汉语具有"可选的"的意思。顾名思义&#xff0c;!optional标记前面的扩展不必须生成一个新的选择器。看一段SCSS代码片段&#xff1a; p{color:red;extend .notice } 由于并不存在一个名为notice的样式类&#xff0c;所以上述代码会报错。代码修改如下&…

Http(s)与后台交互方式

前言 Http(s)是前后端交互的主要方式之一&#xff0c;交互技术主要有:Ajax(XMLHttpRequest)、Fetch、地址跳转(window.open、location.href)。Http(s)与后台交互传递数据的部分有:请求网址、请求头、请求主体、响应头、响应主体 请求网址 请求网址是通过pathname或search进行传…

Python的字符串格式化

Python的字符串格式化有两种方式: 百分号方式、format方式 百分号的方式相对来说比较老&#xff0c;而format方式则是比较先进的方式&#xff0c;企图替换古老的方式&#xff0c;目前两者并存。 This PEP proposes a new system for built-in string formatting operations, in…

使用Spring Form标签探索Spring Controller

在上一篇文章中 &#xff0c;我向您展示了如何使用Spring控制器处理纯HTML表单。 但是处理表单的更强大的方法是使用Spring的ModelAttribute及其spring:form标签。 我将向您展示如何通过修改上一篇文章的项目设置从这里开始。 我们将简单地修改Comment表单和控制器以使用此功能…

predict函数 R_学习|R语言做机器学习的常用函数总结

预测函数&#xff1a;predict() type"prob"判别该量度的昆虫归类为A、B和C的概率&#xff1b;type"response"&#xff1a;判别该量度的昆虫的类别&#xff1b;预测分类的概率的函数predict(…, type)参数type&#xff1a;R语音里面不同模型&#xff0c;参数…

微信小程序:动画(Animation)

简单总结一下微信动画的实现及执行步骤。 一、实现方式 官方文档是这样说的&#xff1a;①创建一个动画实例 animation。②调用实例的方法来描述动画。③最后通过动画实例的 export 方法导出动画数据传递给组件的 animation 属性。 因为小程序是数据驱动的&#xff0c;给这句话…

java map clone_Java中HashMap的clone()方法: java.util.HashMap.clone() - Break易站

Java中的HashMapjava.util.HashMap.clone()方法用于返回所提到的哈希映射HashMap的浅表副本。它只是创建了map的副本。HashMap.clone句法&#xff1a;Hash_Map.clone()参数&#xff1a;该方法不接受任何参数。返回值&#xff1a;该方法只返回HashMap的副本。下面的程序用于说明…

计算模块分析

模块需要实现的功能&#xff1a;1、实现原始深度计算&#xff1a;五个输入、一个输出值和一个输出使能信号&#xff1b; 2、计算幅度值&#xff08;这个功能是一个使能控制的&#xff09;这个的话就是一个行结束信号和一个行输出使能信号&#xff1b; 3、需要告诉相连的模块什么…

为什么我们不应该使用过多的线程

总览 有一个普遍的论点&#xff0c;因为我们有很多核心&#xff0c;并且将来还会有更多核心&#xff0c;所以我们必须使用它们。 我们只是需要找到使用它们的最佳方法&#xff0c;而仅仅是因为我们不能意味着我们应该这样做。 我们的目标是什么&#xff1f; 使用多个线程的充分…

SSM+solr 通过商品搜索学习solr的简单使用

学习了一下https://github.com/TyCoding/ssm-redis-solr这个github上的solr搜索功能&#xff0c;现在来记录一下。 我的理解就是solr有点类似于数据库&#xff0c;但它是有索引的数据库&#xff0c;按很多字段建立索引&#xff0c;可能是b树或者散列索引&#xff0c;然后就能够…

可以使用中文作为变量名_次氯酸可以作为伤口消毒使用吗?

次氯酸可以作为伤口消毒使用吗&#xff1f;次氯酸在经过2020年的洗礼&#xff0c;已然成为常态化&#xff0c;它对于人体是否有害&#xff0c;也是人们关注的焦点。对于那些还不太了解次氯酸的群体做一下简短科普。什么是次氯酸&#xff1f;次氯酸&#xff08;HCIO&#xff09;…

tomcat启动java项目_Java web项目启动Tomcat报错解决方案

点击运行项目时显示 A Java Exception has occurred.Starting Tomcat v9.0 Server at localhost has oncountered a problem.Server Tomcat v9.0 Server at localhost failed tostart.并显示以下两个弹框同时控制台报错org.apache.catalina.startup.Bootstraporg.apache.catali…

Spark2.3(三十五)Spark Structured Streaming源代码剖析(从CSDN和Github中看到别人分析的源代码的文章值得收藏)...

从CSDN中读取到关于spark structured streaming源代码分析不错的几篇文章 spark源码分析--事件总线LiveListenerBus spark事件总线的核心是LiveListenerBus&#xff0c;其内部维护了多个AsyncEventQueue队列用于存储和分发SparkListenerEvent事件。 spark事件总线整体思想是生产…

matlab 从 excel读取 日期_MATLAB批量修改文件名和选择性复制/剪切文件

今天解决的问题&#xff1a;1、如何利用MATLAB批量修改文件名&#xff1f;(前面写过一次bat命令法&#xff0c;这个应该也算一次改进&#xff0c;程序的初衷是想将Smartsolo导出的文件名批量修改为以炮点桩号为文件名)2、如何利用MATLAB选择性批量复制/剪切文件&#xff1f;(程…

CODE[VS] 1860 最大数 1998年NOIP全国联赛提高组

题目描述 Description设有n个正整数&#xff08;n≤20&#xff09;&#xff0c;将它们联接成一排&#xff0c;组成一个最大的多位整数。 输入描述 Input Description第一行一个正整数n。 第二行n个正整数&#xff0c;空格隔开。 输出描述 Output Description连接成的多位数。…

java map 输入 查询 修改_map的查询和修改方法

packagecom.cn.util;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;//循环遍历map的方法public classUtil {public static voidmain(String[] args) {Map tempMap new HashMap(…

您基于JEE的Web项目的结构是什么?

在本文中&#xff0c;我将主要与JSF讨论基于Web的项目的各种组织结构。 开始新项目时&#xff0c;首先想到的是如何组织Java包&#xff1f; 想象一下&#xff0c;您开发了一个基于Web的用户和组管理系统。 很长时间以来&#xff0c;我使用以下Java包结构来将Bean类与模型类分开…

自定义scoll样式

使用伪类自定义scroll样式 效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0,maximum-scale1.0,minimum1.0,…

关于常用的编码工具如何引入jar包

myeclipse和eclipse&#xff08;差不多&#xff09;引入jar包&#xff1a; 普通项目&#xff1a; 1.对准你的项目创建一个文件夹名字尽量命名成lib&#xff08;注意要和src平级&#xff0c;不要在src下创建文件夹&#xff09;。 2.将下载好的依赖放到lib文件夹下&#xff0c; 3…

win10商店打不开_win10自带的照片查看器打不开的修复方法

我们知道win10或win7等系统都自带有默认的照片查看器&#xff0c;安装好系统后&#xff0c;我们再不用安装第三方看图软件来查看照片了&#xff0c;给我们玩电脑带来了极大的方便。但有些朋友近来向我求教照片查看器打不开&#xff0c;或打开很慢不正常的问题。下面我来跟大家介…