Iterable 接口位于 java.lang 包中,它是 Java 集合框架的核心接口之一,其定义为 interface Iterable<T>。
该接口是 Java 中用于实现迭代功能的基础接口,它提供了一种统一的方式来遍历集合中的元素。
注意:任何实现了 Iterable 接口的类都可以使用增强型 for 循环(for-each 循环)进行遍历。
Iterable 接口只有一个方法 iterator(),该方法返回一个 Iterator 类型的对象,Iterator 对象用于定义访问和遍历元素的具体方式。
iterator() 方法定义:
Iterator<T> iterator();
上述方法返回一个实现了 Iterator 接口的对象,该对象定义了如何逐个访问集合中的元素。
首先,我们创建一个简单的自定义类来实现 Iterable 接口。假设我们有一个名为 MyList 的类,它内部使用一个数组来存储元素。
package com.hxstrive.java_lang.iterable;
import java.util.Iterator;
/**
* 自定义List
* @author hxstrive.com
*/
public class MyList<T> implements Iterable<T> {
T[] elements;
public MyList(T[] elements) {
this.elements = elements;
}
@Override
public Iterator<T> iterator() {
return new MyListIterator<T>(this);
}
}上面的 MyList 类实现了 Iterable 接口,它的 iterator() 方法返回一个自定义的 MyListIterator 对象(下面会定义)。这个 MyListIterator 对象将用于遍历 MyList 中的元素。
Iterator 接口也位于 java.lang 包中,它用于定义迭代的具体行为。它有三个主要方法:
hasNext() 用于检查是否还有下一个元素
next() 用于返回下一个元素
remove() 用于从集合中移除当前元素(可选操作)
该类实现了 Iterator 接口,提供便利元素的功能,如下:
package com.hxstrive.java_lang.iterable;
import java.util.Iterator;
/**
* 自定义的迭代器
* @author hxstrive
*/
class MyListIterator<T> implements Iterator<T> {
private MyList<T> myList;
private int currentIndex = 0;
public MyListIterator(MyList<T> myList) {
this.myList = myList;
}
@Override
public boolean hasNext() {
return currentIndex < myList.elements.length;
}
@Override
public T next() {
T element = myList.elements[currentIndex];
currentIndex++;
return element;
}
@Override
public void remove() {
// 为了简单起见,这里暂不实现移除功能
throw new UnsupportedOperationException("remove operation not supported");
}
}在这个 MyListIterator 类中,hasNext() 方法通过检查当前索引是否小于数组长度来判断是否还有下一个元素。next() 方法返回当前索引位置的元素,并将索引递增。remove() 方法在这里抛出一个不支持操作的异常,因为我们暂时不实现元素移除功能。
使用增强型 for 循环遍历自定义的 MyList 类收起java
package com.hxstrive.java_lang.iterable;
/**
* Iterable 示例
* @author hxstrive
*/
public class IterableDemo {
public static void main(String[] args) {
Integer[] numbers = {1, 2, 3, 4, 5};
MyList<Integer> myList = new MyList<>(numbers);
for (Integer number : myList) {
System.out.println(number);
}
}
}在这个示例中,我们首先创建了一个 Integer 数组,然后使用这个数组创建了一个 MyList 对象。由于MyList 实现了 Iterable 接口,我们可以使用增强型 for 循环来遍历 MyList 中的元素。在循环内部,每个元素都会被打印出来。
在 Java 集合框架中,许多集合类(如 ArrayList、LinkedList、HashSet、TreeSet 等)都实现了 Iterable 接口。这使得我们可以方便地使用增强型 for 循环来遍历这些集合中的元素。
例如,对于ArrayList:
import java.util.ArrayList;
import java.util.List;
public class IterableDemo2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
for (String fruit : list) {
System.out.println(fruit);
}
}
}这里 ArrayList 实现了 Iterable 接口,所以可以使用增强型 for 循环来遍历其中的元素,这种方式使得代码更加简洁和易读。