[问题引入]
需求:存储自定义对象并遍历
有5个学生,学生有姓名,年龄,遍历5个学生,输出5个学生对应的信息(集合改进)
分析:
1)创建一个学生类
2)在测试类中,创建集合对象
3)创建5个具体学生对象,并且添加集合中
4)将集合转换数组
5)遍历
6)输出
public static void main(String[] args) {
//创建一个集合对象
Collection c = new ArrayList() ;
//创建5个具体学生对象
Student s1 = new Student("高圆圆", 27) ;
Student s2 = new Student("杨桃", 28) ;
Student s3 = new Student("王力宏", 35) ;
Student s4 = new Student("周星驰", 60) ;
Student s5 = new Student("成龙", 55) ;
//添加到集合中
c.add(s1) ;
c.add(s2) ;
c.add(s3) ;
c.add(s4) ;
c.add(s5) ;
//转换数组
Object[] objs = c.toArray() ;
//遍历
for(int x = 0 ; x < objs.length ;x ++) {
// System.out.println(objs[x]);
//需求:需要的通过getXXX方法获取学生信息
Student s = (Student) objs[x] ; //向下转型
System.out.println(s.getName()+"----"+s.getAge());
}
}
上述toArray()方法转换成数组非常麻烦,并且也不是集合的专有遍历方式,实际还是数组遍历!
所以,引入集合的专有遍历方式:迭代器遍历
(1)Iterator iterator() :集合的迭代器方法(获取集合的迭代器)
集合的专有遍历方式:迭代器遍历
Iterator :接口中有以下的方法:
boolean hasNext() :如果有元素可以迭代,那么返回true,否则返回false
Object next()返回迭代的下一个元素
[需求1]存储String类型的元素并遍历
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList() ;
//添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("javaee");
//通过集合获取迭代器
Iterator it = c.iterator() ;
//使用while循环
while(it.hasNext()) {
//需求:打印字符串同时,获取长度
String str = (String)(it.next()) ;
System.out.println(str+"---"+str.length());
}
}
[需求2]存储自定义对象并遍历(使用专有遍历方式)
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList() ;
//创建学生对象
Student s1 = new Student("张三", 27) ;
Student s2 = new Student("李四", 29) ;
Student s3 = new Student("王五", 25) ;
//添加集合中
c.add(s1) ;
c.add(s2) ;
c.add(s3) ;
//获取迭代器
Iterator it = c.iterator() ;
while(it.hasNext()) {
Student s = (Student)it.next() ;
System.out.println(s.getName()+"="+s.getAge());
}
}
注意:
1)it.next(),只使用一次即可,使用多次,会出现问题(it.next(),每次使用的时候都是返回一个对象)
2)遍历的时候使用的while循环,可不可以使用for循环呢?
可以,但是很少使用!
for(Iterator it = c.iterator() ; it.hasNext();) {
Student s =(Student)it.next() ;
System.out.println(s.getName()+"---"+s.getAge());
}
(2)迭代器的源码分析
interface Iterator{
public abstract boolean hasNext() ;
public Object next();
}
interface Iterable{
Iterator iterator() ;
}
interface Collection extends Iterable{
Iterator iterator() ;
}
inteface List extends Collection{
public abstract boolean hasNext() ;
public Object next();
Iterator iterator() ;
}
class ArrayList implements List{
public Iterator iterator() {
return new Itr();//Itr这个类就是Iterator的子实现类
}
private class Itr implements Iterator{
//实现了hasNext()和next()
public boolean hasNext(){
}
public Object next(){
}
}
}
分析:
1)Iterator it = c.iterator() ; //接口多态的形式
实际起作用的是接口Iterable中的Iterator()方法!
返回值是一个接口,需要它的子实现类对象!
2)Iterator它的子实现类是什么呢?
实现类:是一种匿名的内部类,上述源码中Itr这个类就是Iterator的子实现类