Map.clear() vs new Map: Какой из них будет лучше?

У меня есть синтаксис карты как Map<String, String> testMap = new HashMap<String, String>();. На этой карте может быть 1000 данных.

Когда моему приложению требуется новый список данных, я должен очистить карту. Но когда я увидел код Map.clear() как

/**
     * Removes all of the mappings from this map.
     * The map will be empty after this call returns.
     */
    public void clear() {
        modCount++;
        Entry[] tab = table;
        for (int i = 0; i < tab.length; i++)
            tab[i] = null;
        size = 0;
    }

Я понимаю, что прозрачный метод переходит в цикл для n раз (где n - количество данных в Map). Поэтому я подумал, что может быть способ переопределить эту карту как testMap = new HashMap<String, String>(); и ранее использованная Карта будет собираться Мусором.

Но я не уверен, что это будет хороший путь. Я работаю над мобильным приложением.

Можете ли вы направить меня?

Ответ 1

Сложный вопрос. Посмотрим, что произойдет.

Вы создаете экземпляр нового экземпляра, который поддерживается новым массивом. Таким образом, сборщик мусора должен очистить весь ключ и значения от предыдущей карты и очистить ссылку на себя. Таким образом, алгоритм O (n) выполняется в любом случае, но в потоке коллектора мусора. Для 1000 записей вы не увидите никакой разницы. НО. Производительность guide говорит вам, что всегда лучше не создавать новые объекты, если можно. Поэтому я бы пошел с методом clear().

В любом случае, попробуйте оба варианта и попытайтесь их измерить. Всегда измеряйте!

Ответ 2

Когда вы скажете Map.clear() на карте размера n... Вы просите GC очистить объекты 2*n (Key and Value). Когда вы говорите null на одну и ту же карту, вы просите GC очистить объекты 2*n+1 (1 для самой Карты). Затем вам придется создать новый экземпляр карты еще один накладной. Поэтому перейдите к Map.clear(). Вам будет разумно задавать размер карты при ее создании.

Ответ 3

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

Ответ 4

Идея метода clear() заключается в удалении ссылок на другие объекты с карты, так что ключ/значения не удерживаются от gcing, если "карта ссылается где-то еще".

Но если ваша карта - это локальная карта, используемая только вашим конкретным кодом (т.е. "карта не упоминается где-то в другом месте" ), тогда используйте вместо нее новую карту, но задание 1000 ссылок на null не будет во всяком случае большая производительность.

Ответ 5

Map.clear(), который удалит все данные. Обратите внимание, что это будет только отбрасывать все записи, но сохранить внутренний массив, используемый для хранения записей одного размера (вместо сокращения до начальной емкости). Если вам также необходимо устранить это, самым простым способом было бы отказаться от всего HashMap и заменить его новым экземпляром. Это, конечно, работает только если вы контролируете, у кого есть указатель на карту.

Что касается восстановления памяти, вы должны позволить сборщику мусора выполнять свою работу.

Являются ли ваши значения длинными? В этом случае вам может понадобиться более эффективная реализация (memory-), чем общий HashMap, такой как TLongLongHashMap, найденный в библиотеке GNU Trove. Это должно сэкономить массу памяти.

Ответ 6

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

Ответ 7

не забывайте переполнения карты

Если вы не укажете емкость на новой карте, вы получите довольно много накладных расходов на вновь созданной карте из-за переделов (каждая из которых - O (n) (в то время) и произойдет O (log ( n)), в то время как это может амортизировать до O (n), но если они не будут в первую очередь, вам все равно будет лучше)

это не произойдет с очищенной картой, потому что емкость не изменяется