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

Java 对给定集合对象执行迭代时迭代器的意外输出,java,collections,iterator,Java,Collections,Iterator,不应该是下面代码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 = n

不应该是下面代码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();
        }
    }

}
import java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
公共类CollectionArray{
公共静态void main(字符串[]args){
List num=new ArrayList();

对于(inti=0;i代码中有几个错误,我将在下面列出它们

  • 在打印
    System.out.println(itr.next());
  • 您正在使用值
    9
    创建新的
    Integer
    对象,并比较它们的引用而不是值,结果返回
    false
  • 例如:下面的
    i1
    i2
    是两个具有相同值的
    Integer
    对象,但它们是指向不同引用的两个不同对象。因此
    =
    运算符返回
    false

    Integer i1 = new Integer(10);
    Integer i2 = new Integer(10);  
    
    System.out.println(i1==i2);   //false
    
  • 因此,您可以简单地使用
    equal
    来比较
    Integers
    对象中的值,并且仅在
    equal
    不等于
    9
    时,使用
    else
    块打印值
  • 代码:

       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);
            }
        }
    
    Iterator<Integer> itr = num.iterator();
        while(itr.hasNext()) {
            Integer res = itr.next();
            if(res.equals(int1)) {   // or == operator will work for primitive int types 
                itr.remove();
            }else {
                System.out.println(res);
            }
        }
    

    您的代码中有几个错误,我将在下面列出它们

  • 在打印
    System.out.println(itr.next());
  • 您正在使用值
    9
    创建新的
    Integer
    对象,并比较它们的引用而不是值,结果返回
    false
  • 例如:下面的
    i1
    i2
    是两个具有相同值的
    Integer
    对象,但它们是指向不同引用的两个不同对象。因此
    =
    运算符返回
    false

    Integer i1 = new Integer(10);
    Integer i2 = new Integer(10);  
    
    System.out.println(i1==i2);   //false
    
  • 因此,您可以简单地使用
    equal
    来比较
    Integers
    对象中的值,并且仅在
    equal
    不等于
    9
    时,使用
    else
    块打印值
  • 代码:

       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);
            }
        }
    
    Iterator<Integer> itr = num.iterator();
        while(itr.hasNext()) {
            Integer res = itr.next();
            if(res.equals(int1)) {   // or == operator will work for primitive int types 
                itr.remove();
            }else {
                System.out.println(res);
            }
        }
    

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

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

    这是因为您在循环中调用了两次迭代器,导致跳过元素。您应该重构代码,只调用一次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();
        }
    }
    
    Iterator itr=num.Iterator();
    while(itr.hasNext()){
    整数val=(整数)itr.next();
    如果(值等于(英寸)){
    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();
        }
    }
    
    Iterator itr=num.Iterator();
    while(itr.hasNext()){
    整数val=(整数)itr.next();
    如果(值等于(英寸)){
    itr.remove();
    }
    }