Подтвердить что ты не робот

Производительность: создание массива ArrayList из HashMap.values ​​()

Вопрос в том, сколько стоит создать ArrayList из коллекции HashMap.values ​​()? Или создание значений Collection в одиночку? Предполагая Map.size() > 100k. Объекты также могут храниться в ArrayList (вместо HashMap) все время, что имеет последствия в других частях (модификации элементов, легко с помощью ключа). ArrayList используется для итерации по каждому n-му элементу. (Поэтому сбор значений не может быть использован напрямую). Во время итерации изменений не производится.

4b9b3361

Ответ 1

HashMap.values() не возвращает ArrayList значений, но Values Collection.

Источник:

 public Collection<V> values() {
        Collection<V> vs = values;
        return (vs != null ? vs : (values = new Values()));
    }

Values является AbstractCollection. Причина значений - это просто ссылаться на итератор HashMap.

Ваш вопрос:

Вопрос в том, сколько это стоит создать ArrayList из Коллекция HashMap.values ​​()?

Это линейная сложность (как сказал Божо), поскольку

ArrayList<V> valuesList = new ArrayList<V>(hashMap.values());

ArrayList, valuesList вызывает метод коллекции hashMap toArray(), который по существу выполняет цикл for из 0..N(размер) элемента в коллекции.

Надеюсь, что это поможет.

Ответ 2

HashMap внутренне сохраняет значения в коллекции values. Посмотрите исходный код AbstractMap, родительский элемент HashMap.

Итак HashMap.values() возвращает a Collection. Нет никакого вычисления или копирования данных. Это так быстро, как может быть.

Просто получите значения, а затем выполните цикл for:

int n = 5;  // every 5th element
Object[] values = hashMap.values().toArray();
int size = values.length;
for (int i = 0; i < size; i += n){
   values[i];
   // do something
)

Ответ 3

Чтобы подробно остановиться на решении @Bozho, вы можете просто сделать.

int count = 0;
for(Value value: map.values())
   if(count++ % 5 == 0)
     // do something.

Ответ 4

Вы можете использовать Iterator для пропуска элементов - просто вызовите next() много раз.

Создание списка любой коллекции имеет линейную сложность.

Ответ 5

Вы можете создать свой собственный HashMap, который содержит коллекцию значений Arraylist напрямую (я не считаю, что HashMap делает это бесплатно, структура данных для него отличается). Но для этого требуется некоторая дополнительная кодировка с вашей стороны.