Performance: Creating an ArrayList from HashMap.values()

后端 未结 5 1370
感动是毒
感动是毒 2021-02-12 10:32

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

相关标签:
5条回答
  • 2021-02-12 11:01

    You can use an Iterator to skip elements - just call next() many times.

    Creating a list of any collection has a linear complexity.

    0 讨论(0)
  • 2021-02-12 11:03

    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.

    0 讨论(0)
  • 2021-02-12 11:06

    To elaborate on @Bozho's solution you can just do.

    int count = 0;
    for(Value value: map.values())
       if(count++ % 5 == 0)
         // do something.
    
    0 讨论(0)
  • 2021-02-12 11:06

    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.

    0 讨论(0)
  • 2021-02-12 11:22

    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
    )
    
    0 讨论(0)
提交回复
热议问题