Почему начальная емкость установлена ​​на (MAX_ENTRIES + 1) в LRUCache?

При поиске реализаций LRU Cache для Java наткнулся на два отдельных сообщения с похожими реализациями, и обе инициализируют LinkedHashMap с начальной емкостью = MAX_ENTRIES+1 [например. new LinkedHashMap(MAX_ENTRIES+1, .75F, true) ]

По какой причине (причин) для начальной емкости установлено значение MAX_ENTRIES+1?

Ссылки на сообщения:

Как бы вы реализовали кэш LRU в Java?

Легкий и простой в использовании кэш LRU в java


person G T    schedule 02.09.2015    source источник


Ответы (1)


Потому что они, честно говоря, не знают, что делают.

В документации для LinkedHashMap указывается, что сведения о мощности и коэффициенте загрузки точно такие же, как для HashMap, а HashMap указывает

У экземпляра HashMap есть два параметра, влияющих на его производительность: начальная емкость и коэффициент загрузки. Емкость — это количество сегментов в хэш-таблице, а начальная емкость — это просто емкость на момент создания хэш-таблицы. Коэффициент загрузки — это мера того, насколько полной может быть заполнена хэш-таблица, прежде чем ее емкость будет автоматически увеличена. Когда количество записей в хеш-таблице превышает произведение коэффициента загрузки и текущей емкости, хеш-таблица повторно хешируется (т. е. перестраиваются внутренние структуры данных), так что количество ведра.

«Емкость» карты — это количество сегментов хэш-таблицы, а не количество записей, разрешенных на карте.

Таким образом, хеш-таблица для LinkedHashMap, которую вы описываете, будет изменена при добавлении (MAX_ENTRIES + 1) * 0.75 записей, что, по сути, составит три четверти от MAX_ENTRIES.

Я подозреваю, что они пытались гарантировать, что на карте есть место ровно для одной дополнительной записи, чтобы карта не изменялась в размере между вставкой новой записи и удалением самой старой записи, но это не так. собственно как это работает.

person Louis Wasserman    schedule 02.09.2015
comment
Ааа, понятно :) Спасибо за оперативный ответ. - person G T; 03.09.2015