听说这是一道面试题,兴起研究了下ArrayList的源码熬制而成下列代码,主要使用两个接口:Iterable和Iterator。
要实现一个类可以使用增强for循环
第一步:
使该类实现Iterable,字面理解是:让该类有能力迭代(-able),该接口只有一个需要实现的方法,即:iterator(),方法返回一个迭代器Iterator<T>;
第二步:
定义一个内部类,内部类实现Iterator<T>,该类有大家很熟悉的两个方法:hasNext()和next(),hasNext()用于判断是否还有下一个元素,而next()则是取得下一个元素
上代码:
package test_iterator;
import java.util.Iterator;
public class StudentArray implements Iterable<Student> {
public Student[] students = new Student[5];
private int cursor = 0;
private int len = students.length;
public void add(Student stu) {
if (cursor < len) {
students[cursor++] = stu;
}
}
public Student get(int index) {
if(index<len&&index>=0) {
return students[index];
}
return null;
}
public int size() {
return cursor;
}
public void remove(int cur) {
if (cur >= 0 && cur <= cursor) {
for (int i = cur; i < len; i++) {
if (i + 1 < len) {
students[i] = students[i + 1];
}
}
len--;
cursor--;
} else {
System.out.println("不在此范围");
}
}
@Override
public Iterator<Student> iterator() {
return new StuIterator();
}
class StuIterator implements Iterator<Student> {
int cursor1 = 0;
@Override
public boolean hasNext() {
return cursor1 != len;
}
@Override
public Student next() {
return get(cursor1++);
}
}
}
下面是实体类:
package test_iterator;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name,int age) {
this.setAge(age);
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "学生姓名为:"+this.getName()+"\t学生年龄为:"+this.getAge();
}
}
下面是测试代码:
package test_iterator;
public class Test {
public static void main(String[] args) {
StudentArray sArray = new StudentArray();
sArray.add(new Student("test1", 18));
sArray.add(new Student("test2", 19));
sArray.add(new Student("test3", 20));
sArray.add(new Student("test4", 21));
sArray.add(new Student("test5", 22));
for (Student student : sArray) {
System.out.println(student);
}
}
}
下面是测试结果:
学生姓名为:test1 学生年龄为:18
学生姓名为:test2 学生年龄为:19
学生姓名为:test3 学生年龄为:20
学生姓名为:test4 学生年龄为:21
学生姓名为:test5 学生年龄为:22