В настоящее время я создаю кэш LRU, где мне нужно хранить последние N вставленных элементов. Элементы будут вставляться часто (т. Е. Многие операции записи), а операции чтения обычно возвращают большое количество событий всегда строго в последовательности , хотя и начинающихся в произвольной точке в кэше. Например, предположим, что кэш содержит события:
[1, 2, 3, 4, 5, 6]
Допустимая операция чтения - возвращать итератор для событий [2, 3, 4]
.
Из-за потенциально долгоживущих операций чтения я хотел бы использовать структуру данных, в которой я могу безопасно перебирать логическую копию последовательности для каждой попытки чтения, таким образом предотвращая чтение из кэша задерживая любые последующие записи. Однако использование ванильного Java ArrayList
или LinkedList
подразумевает большие издержки при создании полной копии.
Мой вопрос: существуют ли какие-либо сторонние библиотеки Java, которые предоставляют неизменные структуры данных, подобные Scala, в результате чего попытки изменить структуру данных возвращают новую неизменную копию (которая фактически основана на исходных данных структура и, следовательно, операция копирования очень быстро)? Очевидно, что структура данных не может соответствовать API коллекций Java, поскольку операции, подобные add(T)
, должны будут возвращать новую коллекцию (а не void
).
(Пожалуйста, без комментариев / ответов, ссылаясь на случай преждевременной оптимизации.)
Заранее спасибо.
Примечание
Guava's ImmutableList
почти достигает того, что мне нужно: он позволяет вам звонить copyOf
, где копия обычно ссылается на оригинал (избегая выполнения реальной копии). К сожалению, вы не можете пойти другим путем, добавить элемент в список и получить обратно копию, содержащую новый элемент.