Iterator遍历集合的两种错误写法
错误方式一:
eg:
package 迭代器;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorDemo5 {
public static void main(String[] args) {
Collection c1 = new ArrayList();
c1.add(1234);
c1.add("abc");
c1.add(7890);
c1.add(false);
c1.add(true);
Iterator iterator = c1.iterator();
/*
这个时候我们while循环的判断条件为iterator.next()方法的返回值是否为null,这个时候就是一种错误的写法,这个时候
我们输出的时候会跳着进行输出,从第二个元素开始输出,并且一定会出现NoSuchElementException异常,因为这个时候我们判断
while循环是否跳出的条件是通过next()方法,这个时候最后我们肯定是会出现指针(也就是我们的迭代器)指在null上的情况,因为只有我们的
指针指到null时才会退出while循环,那么也就可以说我们退出while循环的充分必要条件就是出现NoSuchElementException
*/
while(iterator.next() != null){
System.out.println(iterator.next());
}
}
}
- 这种方式中我们只使用了next()方法,我们没有使用hasNext()方法,但是我们这里调用了两次next()方法,这个时候我们一个next()方法用来作为进入while()循环的条件,另一个next()方法写在while循环中用来遍历集合元素
- 这个时候我们输出集合元素是从集合中的第二个元素开始输出,而且是隔一个一输出
- 并且一定会抛出NoSuchElementException异常,因为我们的while循环的判断条件就是通过next() == null;判断的,所以这个时候我们要退出while循环的充要条件就是指针(迭代器)指向了null,这个时候也就是说我们的退出while循环的充要条件就是出现NoSuchElementException异常
错误方式二:
eg:
package 迭代器;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorDemo6 {
public static void main(String[] args) {
Collection c1 = new ArrayList();
c1.add(1234);
c1.add("abc");
c1.add(false);
c1.add(5678);
/*
这个时候我们每次进入while循环中都创建了一个新的Iterator对象,那么这个时候我们创建的新的迭代器都是指向第一个元素之前,这个时候也就是我们的while循环就成为了一个死循环
这个时候我们while循环中也是每次都创建新的Iterator对象,这个时候我们每次输出的就都是我们集合中的第一个元素
所以最终实现是在输出集合中的第一个元素,并且这个时候不终止的输出,是一个死循环
*/
while(c1.iterator().hasNext()){
System.out.println(c1.iterator().next());
}
}
}
- 每次进入while循环中都创建了一个新的Iterator对象,那么这个时候我们创建的新的迭代器都是指向第一个元素之前,这个时候我们的while循环就成为了一个死循环
- while循环中也是每次都创建新的Iterator对象,这个时候我们每次输出的就都是我们集合中的第一个元素
- 最终实现是在输出集合中的第一个元素,并且这个时候不终止的输出,是一个死循环
总结: 我们在使用迭代器遍历集合对象时,一定要注意我们遍历的方式最好就是我们的正常格式
也就是我们下面的例子中的while循环的格式:
package 迭代器;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Iterator;
public class IteratorDemo4 {
public static void main(String[] args) {
Collection c1 = new ArrayList();
c1.add(1234);
c1.add("abc");
c1.add(false);
c1.add(new Dog3());
c1.add(1.5);
/*
这里我们创建出了一个迭代器对象
*/
Iterator iterator = c1.iterator();
/*
这里我们使用方式三对我们的集合元素进行遍历,我们在实际的编程中大多都是使用这种方式遍历集合元素
并且我们使用这种方式可以完全避免出现NoSuchElementException(找不到元素)的情况
*/
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
class Dog3{
private String name;
private int age;
public Dog3(){
}
public Dog3(String name,int age){
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Dog3 dog3 = (Dog3) o;
return age == dog3.age &&
Objects.equals(name, dog3.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Dog3{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}