Я пытаюсь реализовать lru кеш в Java.Моя идея такова:
- Хранить в relatedList порядок элементов кэша.
- Хранить в hashMap элементы появляются в списке для относительно быстрой проверки.
Я изо всех сил стараюсь реализовать часть движущегося элемента в начале кеша.Моя идея состояла в том, чтобы отобразить каждый элемент из кэша в конкретный элементный итератор, и таким образом удаление элемента займет время (1) вместо поиска элемента в списке, но поскольку мой список постоянно меняется, итератор бесполезен(Вы можете использовать его только после того, как я закончу все манипуляции в списке).
Я слышал, что такая реализация возможна в C & C ++, есть ли способ реализовать вышеуказанную идею в JAVA?
Может ли кто-нибудь из вас предложить способ реализации вышеуказанного (без использования других структур данных, таких как LinkedHashMap, только связанный список и обычный hashMap)?
Спасибо заранее!
РЕДАКТИРОВАТЬ
Этот код пока что- предположим, что bookId - это то, что я кеширую.
Все операции, которые не выполняются, - это iterator.next () после изменения списка.
private HashMap<String, ListIterator> fromBookNameToIteraot = new HashMap<>();
private LinkedList<Integer> queue = new LinkedList<>();
private HashMap<Integer, String> fromBookIdToBookName = new HashMap<>();
private Iterator<Integer> iterator = queue.listIterator(0);
private static int bookObjectID = 0;
private int cacheSize;
//Ctor
public LRUCache(int cacheSize) {
this.cacheSize = cacheSize;
}
public void access(String i_BookName){
int tempBook = 0;
//In case the requested book in cache (in our map) - O(1) remove operation
if (fromBookNameToIteraot.containsKey(i_BookName)){
iterator = fromBookNameToIteraot.get(i_BookName);
//Validate the queue is not empty, then remove the one from the map
if(iterator.hasNext()){
tempBook = iterator.next();
iterator.remove();
}
queue.addFirst(tempBook);
iterator = queue.listIterator(0);
fromBookNameToIteraot.put(i_BookName, (ListIterator) iterator);
return;
}
/*
*In this case the book is not in cache, and the cache is full
* - get the last book element from queue as least recently used, and remove it.
* - get the book name (since i don't have DB i used another map to fetch bookName from book object.
* - delete the book from the cache map.
* - insert the new book to cache
* */
else if(queue.size() == cacheSize) {
int bookToDel = queue.getLast();
queue.removeLast();
String bookNameToDel = fromBookIdToBookName.get(bookToDel);
fromBookNameToIteraot.remove(bookNameToDel);
fromBookIdToBookName.remove(bookToDel);
}
queue.addFirst(bookObjectID);
iterator = queue.listIterator(0);
fromBookNameToIteraot.put(i_BookName, (ListIterator) iterator);
fromBookIdToBookName.put(bookObjectID, i_BookName);
bookObjectID++;
}