java:copy-on-write数据结构?

时间:2010-05-05 16:04:58

标签: java collections

Java中是否存在实现类似以下内容的内容

interface MSet<T> extends Iterable<T> {
    /**
     * return a new set which consists of this set plus a new element.
     * This set is not changed.
     */
    MSet<T> add(T t);

    /**
     * return a new set which consists of this set minus a designated element.
     * This set is not changed.
     */
    MSet<T> remove(T t);
}

编辑:我想要CopyOnWriteArraySet之类的东西,除了该类是可变的,我想要一些允许创建新集合的不可变集合。这样做的原因是我需要分发对旧集合的引用并使它们不可变。

编辑2:Scala如何实现scala.collection.immutable.Set?这就是我需要的行为,只是因为我不想仅仅因为这个而吸入所有Scala。

3 个答案:

答案 0 :(得分:2)

使用Google CollectionsImmutable*来满足您所有不可变的集合需求。我想你需要一个轻量级的包装类 - 可以使用Forwarding*(也在GC中)轻松完成 - 在添加/删除操作中产生新的不可变(或可变,无论如何)。最后,如果您的修改不需要自己生成新的修改,您可以使用GC中的静态集合帮助程序库(Iterables,Lists,Sets等)中的各种选项来实现这些操作以获取视图(重新设置) :union,intersection,filter)。

编辑:但是,谷歌代码目前很慢 - 可能需要稍等一会儿才能查看。

答案 1 :(得分:0)

CopyOnWriteArraySet类似。但是,复制是内部的,因此它不会返回对新对象的引用。

答案 2 :(得分:0)

Java中存在写时复制数据结构,例如CopyOnWriteArrayList,但API与您建议的略有不同;它不是返回一个新对象,而是与其他集合具有相同的API,但仅在内部创建一个单独的数组副本。'

您想要的API没有现成的开箱即用型;但是,实施它应该是相当微不足道的;只需复制集合,对副本执行变异操作,然后将其返回。