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