java基础-迭代器(Iterator)与增强for循环
java基础-迭代器(Iterator)与增强for循环
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Iterator迭代器概述
Java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。我们需要取出这些集合中的元素,可通过一种通用的方式来完成。
Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就在取出来。一直把集合中所有的元素全部取出。这种取出方式专业术语称为迭代。换句话说,迭代是取出集合中元素的一种方式,因为Collection中有iterator方法,所以每一个子类集合对象都是迭代器对象。
二.迭代器的实现原理
其实集合中的迭代器就是获取结合中元素的方式。这是时候我们就不得不说一下Iterator接口了,经过查阅API文档发现它有三个抽象方法,如下:

由于Iterator只是接口,不能被直接实例化,因此想要使用该接口就必须实现该接口的所有抽象方法,而我们学习的Collection接口也定影实现Iterator接口的抽象方法,即“iterator()”。因此只要是Collection的实现类就必须重写“iterator()”方法,最终返回“Iterator”接口实现类的对象(也就是可迭代对象),然后在调用hasNext()和next()方法来对集合进行迭代操作。
综上所述,我们可以总结为以下三点:
1>.迭代器不保证取出来元素的顺序和存入的顺序一致,“有序”是靠集合实例本身保证的;
2>.迭代器本身是一个接口,该方法返回的是一个迭代器实例对象,通常使用的是接口多态使用迭代器;
3>.迭代器中常用的两个方法是:
a>.boolean hasNext() : 用来判断结合中是否有下一个元素可以迭代,如果返回true,说明可以迭代。
b>.Object next() : 用来返回迭代的下一个元素,并把指针向后移动一位。
迭代器的执行过程,可以用张图来帮助大家理解,如下:

三.迭代器的代码实现
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class IteratorDemo {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<String>();
coll.add("yinzhengjie");
coll.add("尹正杰");
coll.add("java");
coll.add("python");
coll.add("shell");
coll.add("golang"); //调用集合的方法iterator()获取出,Iterator接口的实现类的对象
Iterator<String> it1 = coll.iterator(); System.out.println("第一种方式进行迭代:");
//1>.用while循环遍历集合进行迭代
while(it1.hasNext()) {
System.out.println("\t"+it1.next());
} System.out.println("第二种方式进行迭代:");
//2>.用for循环进行迭代(相对while循环更节省内存,因为it2是for局部遍历,而it1是main方法的变量)
for(Iterator<String> it2 = coll.iterator();it2.hasNext();) {
System.out.println("\t"+it2.next());
} System.out.println("第三种方式进行迭代:");
//3>.用foreach循环(也叫增强for循环)继续迭代,需要JDK1.5版本以后才可以哟!
for (String string : coll) {
System.out.println("\t"+string);
}
}
} /*
以上代码执行结果如下:
第一种方式进行迭代:
yinzhengjie
尹正杰
java
python
shell
golang
第二种方式进行迭代:
yinzhengjie
尹正杰
java
python
shell
golang
第三种方式进行迭代:
yinzhengjie
尹正杰
java
python
shell
golang
*/
四.集合迭代过程中的转型
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class IteratorDemo {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<String>();
coll.add("yinzhengjie");
coll.add("尹正杰");
coll.add("Java"); Iterator it = coll.iterator();
while(it.hasNext()){
Object obj = it.next();
if(obj instanceof String) {
String str = (String)obj;
System.out.println(str.length());
}
}
}
} /*
以上代码执行结果如下:
11
3
4
*/
五.增强for循环遍历数组
增强for循环是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的,它的内部原理其实是一个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。JDK1.5版本后,出现新的接口,即“java.lang.Iterable”。只要实现“java.lang.Iterable”这个接口,就允许对象称为增强for循环(“foreach”语句,注意“foreach”并不是关键字哟!)的目标。
格式如下:
for( 数据类型 变量名:数组或这集合){
System.out.println(变量名);
}
如果只做遍历的话,推荐大家使用增强for循环, 因为for循环存在优点的同时也会存在缺点。
优点:代码少了,方便对容器遍历。
缺点:没有索引,不能操作容器里面的元素。
接下来我们用foreach来遍历数组和集合,代码如下:
1>.遍历数组
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; public class ForeachDemo {
public static void main(String[] args) { String[] arr = {"yinzhengjie","org","cn"};
for (String string : arr) {
System.out.println(string+"\t\t"+string.length());
}
}
} /*
以上代码执行结果如下:
yinzhengjie 11
org 3
cn 2
*/
2>.遍历集合
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.Collection; class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
}
//这里我们重写一下toString方法!方便System.out.pirntln在调用该对象的toString方法时不会去找Object的默认返回值。
public String toString() {
return this.name + "---" + this.age; }
} public class ForeachDemo {
public static void main(String[] args) {
//接口多态
Collection<Student> coll = new ArrayList<>();
coll.add(new Student("yinzhengjie",18));
coll.add(new Student("尹正杰",20)); for (Student p : coll) {
System.out.println(p);
}
}
} /*
以上代码执行结果如下:
yinzhengjie 11
org 3
cn 2
*/
java基础-迭代器(Iterator)与增强for循环的更多相关文章
- java中的Iterator与增强for循环的效率比较
最近在优化代码时遇到了这个问题:Iterator与增强for循环到底哪个效率高?之前在学习的时候,好像记着老师说过遍历集合(如list)时,使用iterator好像正规一些,因为是专用的,但是运行效率 ...
- Java集合迭代器 Iterator分析
简介 迭代器是遍历容器的一种常用方法,它屏蔽了容器的实现细节,无需暴露数据结构内部,就可以对容器进行遍历,迭代器本身也是一种设计模式,迭代是一种特殊的遍历方式. Iterator 在java中,迭代器 ...
- Java 实现迭代器(Iterator)模式
类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...
- Java基础(三)选择和循环结构
一.选择结构,条件判断 1.if 语句 一个 if 语句包含一个布尔表达式和一条或多条语句.如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码. impor ...
- Java基础:数组的声明,循环,赋值,拷贝。
数组的声明 一般有两种形式的声明: int[] a; int a[]; 这两种声明都没错,但是大多数都使用第一种声明,因为变量名是独立的,不带任何符号. 声明一个数组,并没有将a真正的初始化为一个数组 ...
- Java 中的foreach(增强for循环)
foreach概述 增强for循环:底层使用的是送代器,使用for循环的格式,简化了送代器的书写,foreach是JDK1.5之后出现的新特性 使用增强for循环 遍历集合 /** * 遍历集合 * ...
- Java基础之(九):循环结构
循环结构 前面我们已经聊过了if语句,接下来我们就聊聊跟选择语句一样常用的语句:循环语句. 同样的,所有的循环语句都可以写成for语句 while循环 while循环的格式: while(布尔表达式) ...
- JAVA基础——集合Iterator迭代器的实现
一.迭代器概述 1.什么是迭代器? 在Java中,有很多的数据容器,对于这些的操作有很多的共性.Java采用了迭代器来为各种容器提供了公共的操作接口.这样使得对容器的遍历操作与其具体的底层实现相隔离, ...
- Java中迭代器Iterator的使用
Java集合类中Map接口下的相关类并没有像Collection接口的相关类一样实现get()方法,因此在要实现遍历输出的场景中没法直接用get()方法来取得对象中的数据,但Java本身提供了另一种遍 ...
随机推荐
- bata5
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- Eclipse安卓开发环境
首先,安卓开发就要搭建安卓开发环境,现在可能流行用AS,但是由于个对eclipse恐惧感比较小一点就选择了Eclipse: 大致流程: 1.安装java开发工具包(JDK): 2.Eclipse集成开 ...
- SQL SERVER ENTERPRISE EDITION-CORE VS SERVER+CAL – DEMO ON DIFFERENCES
SQL SERVER ENTERPRISE EDITION-CORE VS SERVER+CAL – DEMO ON DIFFERENCES DHARMENDRA KESHARIAugust 03, ...
- [学习]仿照cnblog 搭建 Oracle RAC 双节点 困.. 后续做不下去了..
1. 学习地址: https://blog.csdn.net/yuzifen?t=1 2. 克隆之前创建好的虚拟机: 3. 给虚拟机增加新的硬盘. 注意事项 1) 必须是厚置备的磁盘才可以. 2) 必 ...
- sublinme 快捷键格式
{"keys": ["ctrl+shift+f"], "command": "reindent" , "arg ...
- 【译】关于vertical-align你应知道的一切
原文地址:Vertical-Align: All You Need To Know 通常我们需要垂直对齐并排的元素. CSS提供了一些可实现的方法:有时我用浮动float来解决,有时用position ...
- 父类是在子类创建对象时候 在子类中创建一个super内存空间
父类是在子类创建对象时候 在子类中创建一个super内存空间
- Qt——用于表格QTableView的模型
如果想使用表格来呈现数据,Qt提供了一个方便的部件QTableWidget,但是直接用它实现一些功能可能比较困难.这里将介绍一种强大.灵活的方式来操作表格. 一.模型/视图架构 在这个架构中,模型用于 ...
- LDA-Latent Dirichlet Allocation 学习笔记
以下内容主要基于<Latent Dirichlet Allocation>,JMLR-2003一文,另加入了一些自己的理解,刚开始了解,有不对的还请各位指正. LDA-Latent Dir ...
- MT【116】三个点动起来
评:当若干个变量时抓住主变量,立体几何问题平面化.