一个集合中是否可以有多个迭代器并且每个迭代器都能独立跟踪?这是在假设分配迭代器后没有删除或插入的情况下。
一个集合中是否可以有多个迭代器并且每个迭代器都能独立跟踪?这是在假设分配迭代器后没有删除或插入的情况下。
是的。
有时候答案必须达到 30 个字符真的很烦人。
是的,这是可能的。这也是它们被称为迭代器而不仅仅是集合方法的原因之一。
例如List
迭代器(定义在AbstractList
中)保存了当前索引的int
(用于迭代器)。如果您创建多个迭代器并调用next()
不同次数,那么它们每个人的int cursor
将具有不同的值。
是和不是。这取决于接口 Iterable<T>
的实现方式。
通常情况下,它应该返回一个实现了 Iterable 接口的类的新实例,类 AbstractList 就是这样实现的:
public Iterator<E> iterator() {
return new Itr(); //Where Itr is an internal private class that implement Itrable<T>
}
如果您正在使用标准的Java类,您可能会期望是这样完成的。
否则,您可以通过调用对象的iterator()
方法进行简单测试,然后运行第一个和第二个,如果它们依赖于第二个,则不应产生任何结果。但这很不可能发生。
import java.util.ArrayList;
import java.util.Iterator;
public class Miterate {
abstract class IteratorCaster<E> implements Iterable<E>, Iterator<E> {
int mIteratorIndex = 0;
public boolean hasNext() {
return mStorage.size() > mIteratorIndex;
}
public void remove() {
}
public Iterator<E> iterator() {
return this;
}
}
class FloatCast extends IteratorCaster<Float> {
public Float next() {
Float tFloat = Float.parseFloat((String)mStorage.get(mIteratorIndex));
mIteratorIndex ++;
return tFloat;
}
}
class StringCast extends IteratorCaster<String> {
public String next() {
String tString = (String)mStorage.get(mIteratorIndex);
mIteratorIndex ++;
return tString;
}
}
class IntegerCast extends IteratorCaster<Integer> {
public Integer next() {
Integer tInteger = Integer.parseInt((String)mStorage.get(mIteratorIndex));
mIteratorIndex ++;
return tInteger;
}
}
ArrayList<Object> mStorage;
StringCast mSC;
IntegerCast mIC;
FloatCast mFC;
Miterate() {
mStorage = new ArrayList<Object>();
mSC = new StringCast();
mIC = new IntegerCast();
mFC = new FloatCast();
mStorage.add(new String("1"));
mStorage.add(new String("2"));
mStorage.add(new String("3"));
}
Iterable<String> getStringIterator() {
return mSC;
}
Iterable<Integer> getIntegerIterator() {
return mIC;
}
Iterable<Float> getFloatIterator() {
return mFC;
}
public static void main(String[] args) {
Miterate tMiterate = new Miterate();
for (String tString : tMiterate.getStringIterator()) {
System.out.println(tString);
}
for (Integer tInteger : tMiterate.getIntegerIterator()) {
System.out.println(tInteger);
}
for (Float tFloat : tMiterate.getFloatIterator()) {
System.out.println(tFloat);
}
}
}
使用并发集合,即使有插入和删除操作,您也可以在不同的线程中拥有多个迭代器。