集合的遍历(方式二)
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);