1.为什么要使用迭代器?
Java容器的种类有很多种,比如ArrayList、LinkedList、HashSet...,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,使用容器时不用关心容器的类型,java引入了迭代器模式。
2.迭代器(Iterator)
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
3.Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
4.迭代器接口定义:
public interface Iterator<E> {
boolean hasNext(); //判断是否存在下一个对象元素
E next(); //获取下一个元素
void remove(); //移除元素
}
5.java中提供了一个Iterator接口,它的功能是返回一个迭代器,该接口实现的子接口有:Collection,List,Set。
使用迭代器遍历集合:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class testIterator {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("efgh");
list.add("jklm");
list.add("Word");
list.add("Holle");
Set<Integer> set=new HashSet<Integer>();
set.add(12);
set.add(34);
set.add(56);
set.add(78);
set.add(90);
System.out.println(list);
System.out.println(set);
Iterator<String> i=list.iterator(); //使用迭代器遍历list
System.out.println("list遍历后:");
while(i.hasNext()) {
String s=i.next();
System.out.println(s);
}
Iterator<Integer> i1=set.iterator(); //使用迭代器遍历set
System.out.println("set遍历后:");
while(i1.hasNext()) {
Integer it= i1.next();
System.out.println(it);
}
}
}
运行结果:
[34, 56, 90, 12, 78]
list遍历后:
abcd
efgh
jklm
Word
Holle
set遍历后:
34
56
90
12
78
相对于迭代器,foreach遍历集合代码更加的简洁,不容易出错。
import java.util.ArrayList;
import java.util.List;
public class TestForeach {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("efgh");
list.add("jklm");
list.add("Word");
list.add("Holle");
System.out.println(list);
System.out.println("list通过foreach遍历后:");
for(String s:list){
System.out.println(s);
}
}
}
运行结果:
[abcd, efgh, jklm, Word, Holle]
list通过foreach遍历后:
abcd
efgh
jklm
Word
Holle
6.for循环和迭代器的对比:
>ArrayList对随机访问比较快,而for循环中使用的get()方法,采用的即是随机访问的方法,因此在ArrayList里for循环快。
> LinkedList则是顺序访问比较快,Iterator中的next()方法采用的是顺序访问方法,因此在LinkedList里使用Iterator较快。
>从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.
>如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样