Iterator遍历集合的两种错误写法[java]

本文介绍了在Java中使用Iterator遍历集合时的两种常见错误方式:一是错误地使用next()方法作为循环条件,导致跳过元素并抛出异常;二是循环内部每次都创建新的迭代器,造成死循环。正确的遍历方式是通过hasNext()判断,然后调用next()获取元素。避免这些错误有助于提高代码质量和效率。
摘要由CSDN通过智能技术生成

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 +
                '}';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值