Как ограничить количество записей в хеш-таблице Java? - PullRequest
9 голосов
/ 08 января 2009

Есть ли такой способ, чтобы я мог указать число n, чтобы при вставке (n + 1) -ой записи сначала удалялась самая старая запись, гарантируя, что размер хеш-таблицы всегда ограничен n?

Ответы [ 6 ]

28 голосов
/ 08 января 2009

LinkedHashMap делает именно это, см. Javadoc для метода removeEldestEntry .

Что-то вроде этого должно сработать, это удалит самую старую вставленную запись:

Map map = new LinkedHashMap() {
    @Override
    protected boolean removeEldestEntry(Entry eldest) {
        return size() > N;
    }
};

Вы также можете удалить самую старую доступную запись, указав ее в конструкторе:

    Map map = new LinkedHashMap(16, 0.75f, true) {
        @Override
        protected boolean removeEldestEntry(Entry eldest) {
            return size() > N;
        }
    };
5 голосов
/ 08 января 2009

Вы ищете LRU кеш , возможно? Вот запись блога на основе LinkedHashMap .

0 голосов
/ 23 августа 2013

Если у вас есть потребности в параллелизме, не пытайтесь решить эту проблему самостоятельно. У CacheBuilder в Guava есть метод .maximumSize (), который позволяет вам ограничить размер карты, хотя, насколько я понимаю, старые записи могут быть удалены до того, как вы достигнете предела.

Есть интересная страница по дизайну структуры данных, которая должна поразить читателя, насколько трудно было бы сделать что-то лучше, чем реализация Google. :)

0 голосов
/ 08 января 2009

Если вы кешируете, вы можете использовать WeakHashMap или WeakReference, и вам не нужно беспокоиться о размере кеша.

0 голосов
/ 08 января 2009

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

0 голосов
/ 08 января 2009

Вы можете рассмотреть возможность использования коллекций Apache. У них есть куча реализаций LRU. В противном случае вы можете легко написать аналогичную оболочку для стандартных библиотечных коллекций; Я не думаю, что есть тот, который вы можете использовать напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...