Java 在这种情况下,为什么不创建新的迭代器对象?

Java 在这种情况下,为什么不创建新的迭代器对象?,java,iterator,deque,Java,Iterator,Deque,这真的让我很困惑。基本上,我想交替打印两个一维向量的元素。我找到了其他人写的解决方案。 在main方法中,我们调用zigzagator.next来打印int num=iter.next返回的数字 在下一个方法中,似乎每次调用下一个方法时都会创建一个新的iter对象。但当我调试时,我发现只创建了两个迭代器对象。一个用于a1,另一个用于a2。因此,每个迭代器对象中的游标都会保留其内存,以便迭代到结束 迭代器iter=deque.pollLast被调用了好几次,但只创建了两个对象,这对我来说毫无意义。

这真的让我很困惑。基本上,我想交替打印两个一维向量的元素。我找到了其他人写的解决方案。 在main方法中,我们调用zigzagator.next来打印int num=iter.next返回的数字

在下一个方法中,似乎每次调用下一个方法时都会创建一个新的iter对象。但当我调试时,我发现只创建了两个迭代器对象。一个用于a1,另一个用于a2。因此,每个迭代器对象中的游标都会保留其内存,以便迭代到结束

迭代器iter=deque.pollLast被调用了好几次,但只创建了两个对象,这对我来说毫无意义。希望有人能帮忙!!非常感谢

public class ZigzagIterator {
Deque<Iterator<Integer>> deque;

public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
    deque = new LinkedList<Iterator<Integer>>();
    if(v1.size() != 0) deque.offerFirst(v1.iterator());
    if(v2.size() != 0) deque.offerFirst(v2.iterator());
}

public int next() {
    Iterator<Integer> iter = deque.pollLast();
    int num = iter.next();
    if(iter.hasNext()) deque.offerFirst(iter);
    return num;
}

public boolean hasNext() {
    return (deque.size() != 0);
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<Integer> a1= new ArrayList<Integer>();
    a1.add(1);
    a1.add(2);
    a1.add(12);
    List<Integer> a2= new ArrayList<Integer>();
    a2.add(3);
    a2.add(4);
    a2.add(5);
    a2.add(6);
    ZigzagIterator zigzagIterator=new ZigzagIterator(a1, a2);
    while (zigzagIterator.hasNext()) 
    System.out.println(zigzagIterator.next());
}
}

这是因为对象引用保持不变,而创建的新对象被指定给2个引用v1、v2。因此,最后2个对象将获得2个引用,从而产生2个可用对象,而其他对象是可垃圾回收的


访问

我仍然对您的困惑感到困惑。在这段代码中,zigzagIterator.next被调用了7次,但Iterator iter=deque.pollLast只创建了两个iter对象,仅用于a1,另一个用于A2,因为您执行了从deque中删除迭代器实例的deque.pollLast,然后是deque.offerFirstiter,它将把相同的迭代器实例放在deque的前面。为什么您认为pollLast创建了迭代器?没有。只有迭代器方法创建迭代器,这意味着代码在构造函数中创建两个迭代器并将它们添加到队列中。代码的其余部分通过从队列中轮询这两个迭代器来使用它们!谢谢你的解释