在java中迭代器的使用是非常常见的,它可以让我们在遍历某种数据结构的序列时,无需关注它的底层结构。它类似于指针,可以遍历整个数据结构序列。
在java中,我们最常使用Iterator接口来实现迭代器,它的源码如下
public interface Iterator {
boolean hasNext();//判断容器是否还有可以访问的元素
Object next();//迭代器向前一步,返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型
void remove();//删除迭代器刚越过的元素
}
常见的集合类内部都实现了Iterator接口,所以可以直接调用iterator()方法返回一个迭代器类型。
而java集合中保存的元素实质是对象的引用,而非对象本身。迭代器迭代出来的对象是引用的拷贝,所以可以通过迭代出来的元素修改集合中的对象
public class demo{
public static void main(String[] args) {
ArrayList<student> array = new ArrayList<student>();
student s1 = new student("tang");
student s2 = new student("gong");
array.add(s1);
array.add(s2);
Iterator<student> it = array.iterator();
for (student i : array){
System.out.println(i.getName());
}
for(student i : array){
i.setName("li");
}
while(it.hasNext()){
System.out.println(it.next().getName());
}
}
}
结果如下,
可以看到,元素对象被修改了
tip:在我们用使用迭代器遍历集合中元素时,如果要使用删除,一定要使用迭代器的remove()方法,否则会造成并发修改异常
常用集合类对象内部都实现了Iterator接口,所以集合类对象都可以直接调用iterator()方法来返回一个迭代器对象。
使用for循环还是迭代器Iterator对比:
采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快
采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快
从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.
而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.(还是说明了一点遍历和集合本身分离了)