java 迭代器 for循环_java基础-迭代器(Iterator)与增强for循环

java基础-迭代器(Iterator)与增强for循环

作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.Iterator迭代器概述

Java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。我们需要取出这些集合中的元素,可通过一种通用的方式来完成。

Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就在取出来。一直把集合中所有的元素全部取出。这种取出方式专业术语称为迭代。换句话说,迭代是取出集合中元素的一种方式,因为Collection中有iterator方法,所以每一个子类集合对象都是迭代器对象。

二.迭代器的实现原理

其实集合中的迭代器就是获取结合中元素的方式。这是时候我们就不得不说一下Iterator接口了,经过查阅API文档发现它有三个抽象方法,如下:

fbb41ebe1f3ef107ad6e61371b98ce19.png

由于Iterator只是接口,不能被直接实例化,因此想要使用该接口就必须实现该接口的所有抽象方法,而我们学习的Collection接口也定影实现Iterator接口的抽象方法,即“iterator()”。因此只要是Collection的实现类就必须重写“iterator()”方法,最终返回“Iterator”接口实现类的对象(也就是可迭代对象),然后在调用hasNext()和next()方法来对集合进行迭代操作。

综上所述,我们可以总结为以下三点:

1>.迭代器不保证取出来元素的顺序和存入的顺序一致,“有序”是靠集合实例本身保证的;

2>.迭代器本身是一个接口,该方法返回的是一个迭代器实例对象,通常使用的是接口多态使用迭代器;

3>.迭代器中常用的两个方法是:

a>.boolean    hasNext() :  用来判断结合中是否有下一个元素可以迭代,如果返回true,说明可以迭代。

b>.Object      next()  :   用来返回迭代的下一个元素,并把指针向后移动一位。

迭代器的执行过程,可以用张图来帮助大家理解,如下:

651f5fbdfbbc3d220b13302c90f78367.png

三.迭代器的代码实现

1 /*

2 @author :yinzhengjie3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/

4 EMAIL:y1053419035@qq.com5 */

6

7 packagecn.org.yinzhengjie.note;8

9 importjava.util.ArrayList;10 importjava.util.Collection;11 importjava.util.Iterator;12

13 public classIteratorDemo {14 public static voidmain(String[] args) {15 Collection coll = new ArrayList();16 coll.add("yinzhengjie");17 coll.add("尹正杰");18 coll.add("java");19 coll.add("python");20 coll.add("shell");21 coll.add("golang");22

23 //调用集合的方法iterator()获取出,Iterator接口的实现类的对象

24 Iterator it1 =coll.iterator();25

26 System.out.println("第一种方式进行迭代:");27 //1>.用while循环遍历集合进行迭代

28 while(it1.hasNext()) {29 System.out.println("\t"+it1.next());30 }31

32 System.out.println("第二种方式进行迭代:");33 //2>.用for循环进行迭代(相对while循环更节省内存,因为it2是for局部遍历,而it1是main方法的变量)

34 for(Iterator it2 =coll.iterator();it2.hasNext();) {35 System.out.println("\t"+it2.next());36 }37

38 System.out.println("第三种方式进行迭代:");39 //3>.用foreach循环(也叫增强for循环)继续迭代,需要JDK1.5版本以后才可以哟!

40 for(String string : coll) {41 System.out.println("\t"+string);42 }43 }44 }45

46

47 /*

48 以上代码执行结果如下:49 第一种方式进行迭代:50 yinzhengjie51 尹正杰52 java53 python54 shell55 golang56 第二种方式进行迭代:57 yinzhengjie58 尹正杰59 java60 python61 shell62 golang63 第三种方式进行迭代:64 yinzhengjie65 尹正杰66 java67 python68 shell69 golang70 */

四.集合迭代过程中的转型

1 /*

2 @author :yinzhengjie3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/

4 EMAIL:y1053419035@qq.com5 */

6

7 packagecn.org.yinzhengjie.note;8

9 importjava.util.ArrayList;10 importjava.util.Collection;11 importjava.util.Iterator;12

13 public classIteratorDemo {14 public static voidmain(String[] args) {15 Collection coll = new ArrayList();16 coll.add("yinzhengjie");17 coll.add("尹正杰");18 coll.add("Java");19

20 Iterator it =coll.iterator();21 while(it.hasNext()){22 Object obj =it.next();23 if(obj instanceofString) {24 String str =(String)obj;25 System.out.println(str.length());26 }27 }28 }29 }30

31

32 /*

33 以上代码执行结果如下:34 1135 336 437 */

五.增强for循环遍历数组

增强for循环是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的,它的内部原理其实是一个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。JDK1.5版本后,出现新的接口,即“java.lang.Iterable”。只要实现“java.lang.Iterable”这个接口,就允许对象称为增强for循环(“foreach”语句,注意“foreach”并不是关键字哟!)的目标。

1 格式如下:2 for( 数据类型 变量名:数组或这集合){3 System.out.println(变量名);4 }

如果只做遍历的话,推荐大家使用增强for循环, 因为for循环存在优点的同时也会存在缺点。

优点:代码少了,方便对容器遍历。

缺点:没有索引,不能操作容器里面的元素。

接下来我们用foreach来遍历数组和集合,代码如下:

1>.遍历数组

1 /*

2 @author :yinzhengjie3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/

4 EMAIL:y1053419035@qq.com5 */

6

7 packagecn.org.yinzhengjie.note;8

9 public classForeachDemo {10 public static voidmain(String[] args) {11

12 String[] arr = {"yinzhengjie","org","cn"};13 for(String string : arr) {14 System.out.println(string+"\t\t"+string.length());15 }16 }17 }18

19

20 /*

21 以上代码执行结果如下:22 yinzhengjie 1123 org 324 cn 225 */

2>.遍历集合

1 /*

2 @author :yinzhengjie3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/

4 EMAIL:y1053419035@qq.com5 */

6

7 packagecn.org.yinzhengjie.note;8

9 importjava.util.ArrayList;10 importjava.util.Collection;11

12 classStudent{13 privateString name;14 private intage;15 publicString getName() {16 returnname;17 }18 public voidsetName(String name) {19 this.name =name;20 }21 public intgetAge() {22 returnage;23 }24 public void setAge(intage) {25 this.age =age;26 }27 public Student(String name, intage) {28 super();29 this.name =name;30 this.age =age;31 }32 publicStudent() {33 super();34 }35 //这里我们重写一下toString方法!方便System.out.pirntln在调用该对象的toString方法时不会去找Object的默认返回值。

36 publicString toString() {37 return this.name + "---" + this.age;38

39 }40 }41

42

43 public classForeachDemo {44 public static voidmain(String[] args) {45 //接口多态

46 Collection coll = new ArrayList<>();47 coll.add(new Student("yinzhengjie",18));48 coll.add(new Student("尹正杰",20));49

50 for(Student p : coll) {51 System.out.println(p);52 }53 }54 }55

56

57 /*

58 以上代码执行结果如下:59 yinzhengjie 1160 org 361 cn 262 */

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值