Java集合的专有遍历方式--迭代器遍历

本文介绍了Java集合的专有遍历方式——迭代器遍历。通过实例展示了如何使用迭代器遍历存储自定义对象的集合,强调了`hasNext()`和`next()`方法的使用,并提到遍历过程中避免多次调用`next()`。此外,还探讨了使用for循环进行遍历的可能性以及迭代器的源码分析,揭示了Iterator接口在实际应用中的多态形式和其实现类的匿名内部类特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

[问题引入]

需求:存储自定义对象并遍历

        有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的子实现类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值