在给定集合对象上执行迭代时,迭代器的意外输出

不是下面代码012345678的输出吗?当我运行它时,输出为02468。请您帮我了解一下。

    import java.util.ArrayList;

    import java.util.Iterator;

    import java.util.List;

    public class CollectionArray {

public static void main(String[] args) {

    List<Integer> num = new ArrayList();
    for (int i=0; i<10; i++) {
        num.add(i);

    }
    //System.out.println(num);

    int int1=9;
    Integer in = new Integer(int1);

    Iterator itr = num.iterator();
    while(itr.hasnext()) {
        System.out.println(itr.next());
        if(itr.next()== in) {
            itr.remove();
        }
    }

}

}

jiejieyanyanhaohao 回答:在给定集合对象上执行迭代时,迭代器的意外输出

您的代码中有几个错误,我将在下面列出所有这些错误

  1. 您在打印itr.next()时使用System.out.println(itr.next());跳过了元素
  2. 您正在创建具有值Integer的新9对象,并比较它们的引用而不是值,这将返回false

例如:i1i2下是两个具有相同值的Integer对象,但它们是指向不同引用的两个不同对象。因此==运算符返回false

Integer i1 = new Integer(10);
Integer i2 = new Integer(10);  

System.out.println(i1==i2);   //false
  1. 因此,您可以简单地使用equal比较Integers对象中的值,并仅使用{{1}来打印equal9以外的值。 }阻止

代码:

else
  1. 但是您不需要创建 int int1=9; Integer in = new Integer(int1); //don't use like this,it is deprecated and no need of it Iterator<Integer> itr = num.iterator(); while(itr.hasNext()) { Integer res = itr.next(); if(res.equal(in)) { itr.remove(); }else { System.out.println(res); } } 对象,可以简单地使用Integer,其中Java可以为您执行auto boxing,还可以使用通用类型的对象,例如equalsIterator<Integer>

代码:

List<Integer> num = new ArrayList<>();
,

这是因为您在循环中两次调用了迭代器,导致跳过了元素。您应该重构代码以仅一次调用next来获得预期的输出,如下所示。

while(itr.hasNext()) {
 int num = itr.next();
    System.out.println(num);
    if(num == in) {
        itr.remove();
    }
}
,

由于该语句System.out.println(itr.next());,您正在跳过元素。 并且 == 用于参考比较而不是内容比较。因此,您的if块永远不会执行, 9 也不会被删除。您应该像下面这样:

Iterator<Integer> itr = num.iterator();
while(itr.hasNext()) {
    Integer val = (Integer) itr.next();
    if(val.equals(in)) {
        itr.remove();
    }
}
本文链接:https://www.f2er.com/3108165.html

大家都在问