Java——集合框架(5)——Collection 元素遍历的三种方式

一、使用 Iterator 遍历集合

1、简要介绍

Iterator 是一个接口,提供了一种遍历集合元素的方法,而不需要关心集合的底层实现。迭代器允许我们在遍历过程中安全地删除集合中的元素。Iterator 的源码:

public interface Iterator<E> {
   
	// 判断是否还有下一个元素
    boolean hasNext(); 
    
    // 获取下一个元素
    E next(); 
    
    // 删除当前迭代器指向的元素
    default void remove() {
   
        throw new UnsupportedOperationException("remove");
    }

	// ...
}

在使用 next() 方法前需要调用 hasNext() 方法判断是否有下一个有效元素。

2、使用示例

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

public class Example {
   
	public static void main(String[] args) {
   
		Collection<String> col = new ArrayList<String>();

		col.add("Hello");
		col.add("World");
		col.add("HelloWorld");

		// 获取集合对应的迭代器
		Iterator<String> itr = col.iterator();

		while(itr.hasNext()) {
    // 判断是否有下一个元素
			String str = itr.next(); // 获取当下一个元素
			System.out.println(str);
		}
	}
}

运行结果:

Hello
World
HelloWorld

如果这里不使用 hasNext() 方法来判断是否又下一个元素,则可能导致迭代器对象内部的游标属性指向的位置超出范围,这样就会抛出 NoSuchElementException 异常。

3、迭代器机制的底层实现

这里为了解释这个底层实现,再给出一个继承和实现关系图:

Java——集合框架(5)——Collection 元素遍历的三种方式_第1张图片

Iterable 接口中,有这样一个公有抽象方法:

    Iterator<T> iterator();

这个方法是用来返回一个迭代器对象的,这个抽象方法,最终会在某个实现类中被实现,这里以 ArrayList 作为例子,所以 ArrayList 类中会有 iterator() 方法的具体实现。

对于这个返回的迭代器对象的类型,在 ArrayList 类的实现中是 ArrayList 的一个内部类 ItrItr 实现了 Iterator 接口。

我们可以查看 ArrayList 的部分源码来验证上面的说法:

    public Iterator<E> iterator() {
    // 重写了 Iterable 接口的 iterator() 方法
        return new Itr();
    }

    private class Itr implements Iterator<E> {
    // 内部类,实现了 Iterator 接口
        int cursor; // 指向下一个要返回的元素的游标
        int lastRet = -1; // 上一个返回的元素的索引,如果没有上一个则为 -1
        int expectedModCount = modCount; // 同步元素个数,用于删除元素

        public boolean hasNext() {
   
            return cursor != size;
        }

        public E next(

你可能感兴趣的:(#,Java,SE,java,开发语言)