Что LinkedHashMap добавляет к обычной HashMap?
- Как сделать LRU-кэш в Java?
- Чем LinkedHashMap отличается от HashMap и TreeMap?
Предсказуемый порядок обхода — по умолчанию в порядке вставки — поверх той же хеш-таблицы.
- Порядок держит двусвязный список через все записи: скорость та же, памяти чуть больше
- Режим accessOrder — порядок по обращению; с removeEldestEntry получается LRU-кэш
А ещё Сортировка по ключу — это TreeMap, а не LinkedHashMap
Подробно
LinkedHashMap наследует HashMap и дополнительно связывает все записи двусвязным списком. Поэтому:
- доступ по ключу — те же O(1) в среднем;
- обход идёт в предсказуемом порядке — по умолчанию в порядке вставки (повторный
putсуществующего ключа порядок не меняет); - цена — две дополнительные ссылки на запись.
Режим порядка доступа. Конструктор LinkedHashMap(capacity, loadFactor, true) включает порядок по обращению: каждый get или put перемещает запись в конец. Если переопределить removeEldestEntry, получится кэш, вытесняющий давно не использованные записи (LRU), — частая задача на собеседовании.
Когда что выбирать: только быстрый доступ — HashMap; нужен порядок вставки (например, сохранить порядок полей JSON) — LinkedHashMap; нужна сортировка по ключу и диапазоны — TreeMap.
Пример
class LruCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
LruCache(int capacity) {
super(16, 0.75f, true); // порядок по обращению
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}Что хотят услышать
- Предсказуемый порядок обхода, по умолчанию — вставки.
- Как это устроено: двусвязный список поверх хеш-таблицы.
- Режим accessOrder и LRU-кэш — плюс.
- Отличие от TreeMap.
Частые ошибки
- Путать порядок добавления с сортировкой по ключу.
- Считать эту реализацию потокобезопасной.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Сортировку элементов по значению ключа
- ✗Потокобезопасность при доступе из нескольких потоков
- ✓Предсказуемый порядок обхода, по умолчанию — порядок вставки
- ✗Возможность хранить несколько значений под одним и тем же ключом
Что спросят дальше
- Как на её основе делают LRU-кэш?
- Чем она отличается от реализации на дереве?
Разбор темы
- LinkedHashMap и LRU-кэш
Порядок вставки против порядка доступа, связанный список поверх HashMap и реализация LRU через removeEldestEntry.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.