Java 在这种情况下,为什么不创建新的迭代器对象?
这真的让我很困惑。基本上,我想交替打印两个一维向量的元素。我找到了其他人写的解决方案。 在main方法中,我们调用zigzagator.next来打印int num=iter.next返回的数字 在下一个方法中,似乎每次调用下一个方法时都会创建一个新的iter对象。但当我调试时,我发现只创建了两个迭代器对象。一个用于a1,另一个用于a2。因此,每个迭代器对象中的游标都会保留其内存,以便迭代到结束 迭代器iter=deque.pollLast被调用了好几次,但只创建了两个对象,这对我来说毫无意义。希望有人能帮忙!!非常感谢Java 在这种情况下,为什么不创建新的迭代器对象?,java,iterator,deque,Java,Iterator,Deque,这真的让我很困惑。基本上,我想交替打印两个一维向量的元素。我找到了其他人写的解决方案。 在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创建了迭代器?没有。只有迭代器方法创建迭代器,这意味着代码在构造函数中创建两个迭代器并将它们添加到队列中。代码的其余部分通过从队列中轮询这两个迭代器来使用它们!谢谢你的解释