Iterator(迭代器)、增强for循环

一、迭代器的概念                                                                                                                                                   点击此处返回总目录

二、Iterator接口

三、Iterator的实现过程

四、增强的for循环

一、迭代器(Iterator)介绍

在java里面有一个接口:Iterator。

java里面有很多集合,每种集合元素存储的方式不一样,取的方式可能也不一样。每一个都学习怎么获取很不现实,这时候就出现了迭代器,把所有的集合都搞成同样的方式获取。迭代器的好处就是,屏蔽掉了各种集合的不同。

Collection集合元素的通用获取方式:取元素之前首先判断集合中有没有元素,如果有,就把元素取出来,如果还有,就继续取出,直到取完。这种取出方式的专业术语就叫迭代。(说白了,就是遍历)

迭代器:获取集合中元素的一种方式。

二、Iterator接口

共有三个抽象方法,我们学习两个:

1. boolean hasNext()                    //如果仍有元素可以迭代,则返回 true。

2. E next()                                     //获取下一个元素。

因为Iterator是接口,所以应该找他的实现类。

接口Colletion中的iterator()方法,返回的就是在此 collection 的元素上进行迭代的迭代器。

ArrayList是Collection的实现类,重写了iterator对象,返回的是Iterator接口的实现类的对象。

所以通过ArrayList的对象调用iterator()方法,方法的运行结果就是Iterator接口的实现类的对象。可以通过多态的方式接收一下。

这就是面向接口的编程。

例1:Iterator的使用

package cn.itcast.demo05;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<String>();
        coll.add("aaa");
        coll.add("bbb");
        
        Iterator<String> it = coll.iterator();    //多态。调用iterator方法获取Iterator接口的实现类的对象。
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

例2:Collection<String>中的<String>可以不写,这时集合什么都可以存。如果不写,Iterator<String>中的<String>也不能写。

//Person.java

package cn.itcast.demo05;

public class Person {
    private String name;
    private int age;
    
    
    public Person(){}
    
    public Person(String name, int age) {
        this.name = name;
        this.age = 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 String toString(){
        return this.name +"--"+this.age;
    }
    
}

//Test.java

package cn.itcast.demo05;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        Collection coll = new ArrayList();      //不写<String>,什么都能存。   
        coll.add("aaa");
        coll.add(new Person("liu",23));        //既可以存字符串,又能存Person对象。
        
        Iterator it = coll.iterator();                 //不写<String>
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

运行结果:

aaa
liu--23

三、Iterator的实现过程

当执行coll.iterator();时,会创建一个指针,指向-1的位置。

当执行it.hasNext()时,会判断指针指的位置有没有下一个元素。

当执行it.next()时,首先把下一个元素取出来,然后指针往后移动一位。只有执行next()时,指针才往后移动。

例如下面的例子:

           "aaa"   "bbb"  "ccc" 

     -1      0          1        2    

coll.iterator();                //初始化,指针指向-1

it.hasNext();                  //有下一个元素("aaa")

it.next();                        //返回"aaa",指针指向0

it.hasNext();                  //有下一个元素("bbb")

it.next();                        //返回"bbb",指针指向1

it.hasNext();                  //有下一个元素("ccc")

it.next();                        //返回"ccc",指针指向2

it.hasNext();                  //没有下一个元素了。


四、增强for循环

增强的for循环是jdk1.5新特性。

jdk1.5之后,出现了新的接口java.lang.Iterable,Collection开始继承Iterable。而Iterable接口出现目的就是为了实现增强的for循环。

凡是见到的集合,还有数组,都可以使用增强for循环。

格式:

for(数据类型 变量名: 数组或集合){

         sop(变量);

}

好处:代码少

坏处:只能做遍历用。没有索引,不能操作容器里面的数。

例1:增强for循环使用

package cn.itcast.demo06;

public class Test {
    public static void main(String[] args) {
        int[] arr = {1,22,3,4,5};
        for(int i:arr){
            System.out.println(i);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/81783866