迭代
元素(Element):被管理的原子数据,元素类型不限。
集合(Collection):存放元素的容器,需要利用一定的数据结构知识对元素进行组织。
迭代(Iterate)/遍历(Traversal):在数据结构的语境下,往往表示对一个集合中的所有元素都按照一定的顺序处理一次。
Java中常见的Iterate接口和继承的类
顺序表ArrayList的继承链条简单版:
顺序表的迭代能力和迭代器
每种容器(Collection)都是具备迭代能力(Iterable)的。所以每种容器都自带一个方法返回一个适合的迭代器(Iterator)以对容器进行无视实现差别的迭代。
迭代能力和迭代器的接口经常使用的方法
import java.util;
/**
* 迭代能力的接口表示具备迭代能力的。
* 参数类型
* T - 迭代器返回的元素的类型
*/
public interface Iterable<T> {
// 返回类型为 T元素的迭代器。
Iterator<T> iterator();
}
Iterable接口 表示可以被迭代的,其中的iterator()
方法,返回迭代器,通过迭代器可以实现进一步的迭代。
import java.util;
/**
* 迭代器,提供无视具体实现,遍历容器中每个元素的能力
* 参数类型
* E - 此迭代器返回的元素的类型
*/
public interface Iterator<E> {
//如果迭代还有下一个元素,则返回true 。 (换句话说,如果next()返回一个元素而不是抛出一个异常,则返回true )
boolean hasNext();
// 返回迭代中的下一个元素。
E next();
// 从底层集合中删除此迭代器返回的最后一个元素(可选操作)。 此方法只能调用一次next() 。
// 如果底层集合在迭代过程中以任何方式进行修改而不是通过调用此方法,则迭代器的行为是未指定的。
default void remove() {
throw new UnsupportedOperationException("remove");
}
}
Iterator接口是迭代器,boolean hasNext();
方法是用来判断容器内是否还有下一个元素没有迭代,返回boolea类型。
E next();
方法是用来返回此时容器内的下一个元素,同时跳过该元素,表示这个元素已经被迭代了。基于hasNext()
方法返回true,说明容器内右下一个元素,如果没有下一个元素则抛出异常:NoSuchElementException
- 如果迭代没有更多的元素 。
代码示例
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
// Iterable<Integer> iterable = list;
// Iterator<Integer> iterator = iterable.iterator();
// 上面这两步可以简化为下面这一步。
Iterator<Integer> iterator = list.iterator();
System.out.println(iterator.hasNext());
System.out.println(iterator.next());
System.out.println(iterator.hasNext());
System.out.println(iterator.next());
System.out.println(iterator.hasNext());
System.out.println(iterator.next());
System.out.println(iterator.hasNext());
// System.out.println(iterator.next());//实现这一步会抛出异常java.util.NoSuchElementException
}
}
打印输出内容为:
true
1
true
2
true
3
false
搭配while循环使用也能达到迭代输出容器中的每个元素的效果。
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
//只要还有下一个元素,循环就继续
while (iterator.hasNext()) {
//获取下一个元素,并让迭代器走到next()之后的位置
System.out.println(iterator.next());
}
}
}
输出结果:
1
2
3
补充:凡是具备迭代能力的对象,都可以使用for-each
语法进行每个元素的遍历。
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for (int num : list) {
System.out.println(num);
}
}