Question is how much it costs to create an ArrayList from a HashMap.values() Collection? Or creating the values Collection alone? Assuming Map.size() > 100k. Objects could also
HashMap.values()
doesn't return an ArrayList
of values but a Values
Collection.
Source:
public Collection<V> values() {
Collection<V> vs = values;
return (vs != null ? vs : (values = new Values()));
}
Values
is an AbstractCollection
. The reason for values is just to reference HashMap's iterator.
Your question:
Question is how much it costs to create an ArrayList from a HashMap.values() Collection?
That's a linear complexity (as Bozho said) since
ArrayList<V> valuesList = new ArrayList<V>(hashMap.values());
the ArrayList, valuesList
calls the collection hashMap
toArray()
method which essentially does a for
loop from 0..N (size) element in the collection.
Hope this helps.
HashMap
internally stores values in a Collection values
. Take a look at the source code of AbstractMap
, the parent of HashMap
.
So HashMap.values()
directly returns a Collection
. There is no computation or data copying done. It's as fast as it can be.
Just get the values and then do a for loop:
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
)
To elaborate on @Bozho's solution you can just do.
int count = 0;
for(Value value: map.values())
if(count++ % 5 == 0)
// do something.
You can use an Iterator
to skip elements - just call next()
many times.
Creating a list of any collection has a linear complexity.
You can create Your own HashMap, that holds the Arraylist collection of values directly (i do not believe that HashMap does it for free, the data structure for it is different). But this requires some additional coding from Your side.