我是靠谱客的博主 如意蜗牛,最近开发中收集的这篇文章主要介绍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();                  //没有下一个元素了。

 

 

 

 

四、迭代器的并发修改异常

在使用迭代器进行遍历的时候,不允许修改集合的长度。否则会报:java.util.ConcurrentModificationException。不改长度是指不能进行增删元素的操作,但是可以改元素。

 

例:对集合元素进行遍历,当发现元素是"bbb"时,添加元素"eee"。下面的程序会报错。

package cn.itcast.demo03;

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");
        coll.add("ccc");
        
        Iterator<String> it = coll.iterator();
        while(it.hasNext()){
            String s = it.next();
            if(s.equals("bbb")){
                coll.add("eee");                                      //当使用迭代器遍历的时候,使用了add操作,改变了集合的长度。报错。
            }
        }
       
    }
}

 

 

 

 


五、增强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);
        }
    }
}

 

 

 

 

最后

以上就是如意蜗牛为你收集整理的Iterator(迭代器)、增强for循环的全部内容,希望文章能够帮你解决Iterator(迭代器)、增强for循环所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部