Java不可变列表

Ada*_*ski 8 java concurrency caching immutability

我目前正在构建一个LRU缓存,我需要存储最后N个插入的项目.项目将被频繁插入(即许多写入操作),并且读取操作通常将严格按顺序返回大量事件,尽管从高速缓存中的任意点开始.例如,假设缓存包含事件:

[1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

合法的读操作是通过事件返回迭代器[2, 3, 4].

由于读取操作可能是长期存在的,我想使用一种数据结构,我可以安全地迭代每次读取尝试的序列的逻辑副本,从而防止高速缓存读取阻止任何后续写入.但是,使用vanilla Java ArrayList或者LinkedList在制作完整副本时会产生很大的开销.

我的问题:是否有任何第三方Java库提供类似于Scala的不可变数据结构,因此修改数据结构的尝试返回一个新的不可变副本(实际上它基于原始数据结构,因此复制操作非常快)?显然,数据结构无法符合Java Collections API,因为add(T)需要返回新集合(而不是void)的操作.

(请不要评论/回答引用这个作为过早优化的情况.)

提前致谢.

注意

Guava ImmutableList几乎实现了我的需求:它允许您调用copyOf副本通常引用原始内容(避免执行实际副本).不幸的是,你不能走另一条路并将一个项目添加到列表中并返回包含新元素的副本.

San*_*rma 8

功能Java以库(不是不同的语言)的形式出现,并提供不可变的集合.不确定它是否符合您的需求但值得一试.