我目前正在构建一个LRU缓存,需要存储最后N个插入的项目。这些项目将经常被插入(即许多写操作),读取操作通常会按顺序返回大量事件,尽管从缓存中的任意点开始。例如,假设缓存包含以下事件:
[1, 2, 3, 4, 5, 6]
一种合法的读操作是返回一个包含事件
[2, 3, 4]
的迭代器。由于读操作可能是长时间运行的,我想使用一种数据结构,在每次读取尝试时都可以安全地迭代逻辑副本序列,从而防止缓存读取阻塞任何后续写入。但是,使用普通的Java ArrayList
或 LinkedList
意味着需要付出较大的开销来进行完全复制。我的问题是:是否有第三方Java库提供不可变数据结构,类似于Scala,其中修改数据结构的尝试返回一个新的不可变副本(实际上基于原始数据结构,因此复制操作非常快)? 显然,该数据结构不能符合Java集合API,因为例如add(T)
等操作需要返回新集合(而不是void
)。请注意,Guava的ImmutableList
几乎实现了我所需的功能:它允许您调用copyOf
,其中副本通常引用原始副本(避免执行实际副本)。 不幸的是,您不能沿另一条路线添加项目到列表中并返回包括新元素的副本。感谢您的帮助。