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本身提供了另一种遍 ...
随机推荐
- [BUAA OO]第三次博客作业
OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...
- c# 写文件注意问题及用例展示
以txt写string举例,正确代码如下: private void xie() { FileStream fs = new FileStream("1.txt", FileMod ...
- Internet History, Technology and Security (Week8)
Week 8 This week we start two weeks of Internet Security. It is a little technical but don't worry - ...
- Unity3D游戏开发——显示物品的仓库UI
访问仓库物品列表的方法 为了在UI中显示物品列表,我们需要给InventoryManager添加两个能够访问它的公有方法: 代码: ··· public List<string> GetI ...
- Unity3D游戏开发——访问集中式共享模块的设计模式
什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.设计模式是开发人员在开发过程中面临的一般问题的解决方案,这些解决方案是众多开发人 ...
- 结对&团队之1715|K班取经
声明:同学请勿抄袭,追责莫要怪我: 因为暂时闲着没事,就翻阅学长学姐的博客找找灵感,个人觉得应该还有人和我一样对软工实践未来的一大段路还很天真,包括目前的结对作业和团队组队也很迷路,于是写下这篇博客提 ...
- bootstrap使用总结
bootstrap是一个webcss框架,集合了html/css/jquery为一家,创建响应式的页面.所谓的响应式就是适配不同的上网设备. 使用bootstrap的步骤: 1.下载bootstrap ...
- windows下的C++ socket服务器(3)
int make_server_socket(int port) { WSADATA inet_WsaData; WSAStartup(MAKEWORD(), &inet_WsaData); ...
- QT源码解析(七)Qt创建窗体的过程,作者“ tingsking18 ”(真正的创建QPushButton是在show()方法中,show()方法又调用了setVisible方法)
前言:分析Qt的代码也有一段时间了,以前在进行QT源码解析的时候总是使用ue,一个函数名在QTDIR/src目录下反复的查找,然后分析函数之间的调用关系,效率实在是太低了,最近总结出一个更简便的方法, ...
- Windows 配置Reids集群 Redis Cluster
一 .所需软件:Redis.Ruby语言运行环境.Redis的Ruby驱动redis-xxxx.gem.创建Redis集群的工具redis-trib.rb 二 .安装配置redis redis下载地 ...