集合的遍历方式二

集合的遍历(方式二)

1、迭代器
Iterator iterator()  Collection集合的子类特有的
//注意这个方法,返回值类型Iterator,一个接口,实际返回的是这个接口实现类的对象

接口中的抽象方法:

boolean hasNext() //迭代具有更多元素,返回true
Objext next() //返回迭代的下一个元素

eg: 用集合创建5个学生对象,并遍历对象

分析:
  • 创建集合对象
  • 创建对象元素
  • 把元素添加到集合
  • 遍历集合
    a:通过集合对象那个获取迭代器
    b:通过迭代器对象的hasNext()方法判断是否有元素
    c:通过迭代器对象的next()方法获取元素并移动到下一位置
详细代码
//创建集合对象
Collection c = new ArrayList();
//创建并添加元素
c.add("hello");
c.add("java");
//用iterator方法的返回类型来接收
Iterator it = c.iterator(); //这里应该存在向上转型,因为iterator方法返回的是接口实现类的对象

//用while循环遍历
while(it.hasNext()){
	//用Student类型接收,注意转型的时候要类型匹配
	Student s = (Student) it.next();
	//c.add("javaee");并发性异常
	System.out.println(s.getName()+"--"+s.getAge());
//改进
for(Iterator it = c.iterator();it.hasNex();){
	//System.out.println((Student).it.next().getName()+"--"(Student).it.next().getAge());
	//防止走进这个误区,因为next()始终返回的是迭代的下一个对象,这样结果产生的名字和年龄是不匹配,结果是错误的_
	Student s = (Student) it.next();
	System.out.println(s.getName+"--"+s.getAge());
}
}

注意:

  • 使用while循环遍历的结构更加清晰,但是使用for循环遍历的效率其实更高,因为局部变量用完就变成垃圾。
  • 迭代器依赖于集合存在,如果在循环中对集合进行了修改,那么迭代器其实是不知道,iu会引起并发行异常。
解决方案:

A:迭代器遍历元素,迭代器修改元素
//而其实Iterator迭代器中式没有添加功能的,但是其子接口ListIterator是有的

ListIterator lit2 = lit.listIterator();
	while(lit2.hasNext){
		String s = (String) lit2.next();
		if("world".equals(s)){
			lit.add("javaee"); //但是元素是跟在刚刚迭代的元素后面的
		}
	}

B: 集合遍历元素,集合修改元素(刚刚的普通for实现)这个元素是在最后添加的

for(int x = 0; x < lit.size() ; x++ ){
		String s = (String) lit.get(x);
		if("world".equals(s)) {
			lit.add("javaee");
		}
	}
	System.out.println("lit"+"--"+lit);
发布了52 篇原创文章 · 获赞 6 · 访问量 1453

猜你喜欢

转载自blog.csdn.net/qq_40488936/article/details/103623426