Что проверяет вопрос «зачем в LinkedHashMap accessOrder»
По умолчанию LinkedHashMap хранит порядок вставки: сколько ни читай элементы, порядок в итераторе не меняется. Вопрос про accessOrder проверяет, знаете ли вы, что у класса есть второй режим.
С конструктором LinkedHashMap(capacity, loadFactor, true) порядок итерации становится порядком последнего доступа: и get(), и put() двигают элемент в конец списка. Именно на этом строят LRU-кэш без ручного связного списка.
Собеседующего интересует конкретика: removeEldestEntry() — protected-метод, который вызывается после каждого put(). Если вернуть true, самый старый или наименее недавно использованный элемент удаляется автоматически.
class LruCache extends LinkedHashMap {
private final int capacity;
LruCache(int capacity) { super(capacity, 0.75f, true); this.capacity = capacity; }
@Override protected boolean removeEldestEntry( Map.Entry eldest) { return size() > capacity; } }
Спросят следом: почему это не потокобезопасно и что будет при конкурентном get() на accessOrder=true карте. Ответ — связный список внутри мутируется при чтении, параллельный доступ без внешней синхронизации ломает саму структуру, не только данные.
Если видите вручную написанный LRU с HashMap и отдельным Deque — велика вероятность, что автор не знал про accessOrder.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки