Java 集合,允许在迭代时添加和删除



如果有任何框架可以实现具有以下行为的集合,我很感兴趣。


假设它最初包含:[1, 2, 3]

  • 我迭代它(使用迭代器)并到达元素 2,现在我在末尾添加 4(集合现在将是 [1, 2, 3, 4])。
  • 现在我创建一个新的迭代器并迭代集合,结果为 [1, 2, 3, 4]
  • 我继续使用第一个迭代器进行迭代,它将只给我 3 并返回
  • 现在重置第一个迭代器将给我 [1, 2, 3, 4](类似于创建一个新的迭代器)。

删除元素也应如此。如果我删除 3 而不是添加,第二个迭代器应该给我 [1, 2],而第一个迭代器仍然会给我 3 和结束。


因此,当我得到和迭代器时,我希望它给我创建迭代器时的集合(即使我稍后迭代它,我迭代

一点并稍后继续),当我重置迭代器时,它被垃圾收集它将更新到最新版本,我应该能够在不同的时间创建多个迭代器实例,这些实例将根据内容提供不同的版本创建迭代器时的数组。

我需要它与多个线程很好地配合使用,并且最好有一个有效的实现。

有谁知道这种集合的任何实现,还是我必须自己实现它?

java.util.concurrent.CopyOnWriteArrayList的行为是这样的,除了没有Java集合可以"重置"迭代器 - 但是获得一个新的迭代器而不是重置具有您在此处请求的效果。

你描述的内容看起来与CopyOnWriteArrayList的工作方式非常相似:

  • 开始迭代后,可以在不影响迭代的情况下更改集合(包括从另一个线程更改集合)
  • 如果创建新的迭代器,它将基于创建时的集合
  • 它是线程安全的

下面是具有以下输出的简单示例:

迭代器 1 - 1
已添加
4 个 迭代器 2 - 1
迭代器 2 - 2
迭代器 2 - 3
迭代器 2 - 4
迭代器 1 - 2
迭代器 1 - 3

public static void main(String[] args) throws InterruptedException {
    final List<Integer> list = new CopyOnWriteArrayList<Integer>();
    list.addAll(Arrays.asList(1, 2, 3));
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (Integer i : list) {
                System.out.println("Iterator 1 - " + i);
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {}
            }
        }
    }).start();
    Thread.sleep(10);
    list.add(4);
    System.out.println("4 has been added");
    for (Integer i : list) {
        System.out.println("Iterator 2 - " + i);
    }
}

您可以使用番石榴库中的不可变集合。

返回的不可变列表经常 - 并非总是如此,但经常 -- 一个恒定的俯视图,而不是一个显式的副本。也就是说,它通常比你的平均列表更聪明 - 例如,它将使用 高效包含后备集合的方法。

你可以

利用java.util.concurrent.CopyOnWriteArrayList<E>

根据文档:

ArrayList 的线程安全变体,其中所有可变操作 (添加、设置等)是通过制作 底层数组。

它很昂贵,但线程安全。

这通常成本太高,但可能比 当遍历操作数量远远超过突变时,替代方案,以及 当您无法或不想同步遍历时很有用,但 需要排除并发线程之间的干扰。"快照" 样式迭代器方法使用对数组状态的引用 创建迭代器的点。

当迭代发生在某种快照上时,不支持对Iterator本身的操作(removesetadd)。

javolution have threadsafe FastMap

相关内容

  • 没有找到相关文章

最新更新