Java中的集合是否可以有多个迭代器?

6

一个集合中是否可以有多个迭代器并且每个迭代器都能独立跟踪?这是在假设分配迭代器后没有删除或插入的情况下。


7
你尝试时发生了什么? - Brian Roach
5个回答

15

是的。

有时候答案必须达到 30 个字符真的很烦人。


同意。Java会自动创建线程并进行同步吗? - cp.
@cp:迭代器与线程无关。任何线程都必须由您自己完成。 - ColinD
如果我从一个集合中创建两个迭代器,它们不会在不同的线程中运行,插入/删除操作也不会被包含在任何使用中吗? - cp.
@cp:发生的情况完全取决于您如何使用迭代器和底层集合。如果您开始遍历迭代器,然后在不使用迭代器修改集合的情况下进行修改,则在继续迭代时会出现“ConcurrentModificationException”异常。 - ColinD

9

是的,这是可能的。这也是它们被称为迭代器而不仅仅是集合方法的原因之一。

例如List迭代器(定义在AbstractList中)保存了当前索引的int(用于迭代器)。如果您创建多个迭代器并调用next()不同次数,那么它们每个人的int cursor将具有不同的值。


1

是和不是。这取决于接口 Iterable<T> 的实现方式。

通常情况下,它应该返回一个实现了 Iterable 接口的类的新实例,类 AbstractList 就是这样实现的:

public Iterator<E> iterator() {
    return new Itr(); //Where Itr is an internal private class that implement Itrable<T>
}

如果您正在使用标准的Java类,您可能会期望是这样完成的。

否则,您可以通过调用对象的iterator()方法进行简单测试,然后运行第一个和第二个,如果它们依赖于第二个,则不应产生任何结果。但这很不可能发生。


1
你可以这样做:
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);
        }
    }
}

0

使用并发集合,即使有插入和删除操作,您也可以在不同的线程中拥有多个迭代器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接